UPC-2021个人训练赛第20场-部分题解

简介: RGB Triplets题目描述输入输出样例输入 Copy样例输出 Copy提示Select Half题目描述输入输出样例输入 Copy样例输出 Copy提示心灵的抚慰题目描述输入输出样例输入 Copy样例输出 Copy提示

RGB Triplets


题目描述


We have a string S of length N consisting of R, G, and B.

Find the number of triples (i, j, k) (1≤i<j<k≤N) that satisfy both of the following conditions:

·Si≠Sj, Si≠Sk, and Sj≠Sk.

·j−i≠k−j.


Constraints

·1≤N≤4000

·S is a string of length N consisting of R, G, and B.


输入


Input is given from Standard Input in the following format:

N

S


输出


Print the number of triplets in question.


样例输入 Copy


【样例1】

4
RRGB


【样例2】

39
RBRBGRBGGBBRRGBBRRRBGGBRBGBRBGBRBBBGBBB


样例输出 Copy


【样例1】

1

【样例2】

1800


提示


样例1解释:

Only the triplet (1, 3, 4) satisfies both conditions. The triplet (2, 3, 4) satisfies the first condition but not the second, so it does not count.


组合数学

从只含有RGB三个字符的字符串中挑选出满足条件的三元组数量满足 (i, j, k) (1≤i<j<k≤N)

·Si≠Sj, Si≠Sk, and Sj≠Sk.

·j−i≠k−j.

typedef int itn;
int n, m;
ll a[maxn];
ll pre[maxn];
ll dp[maxn];
int main() {
    cin >> n;
    string s;
    cin >> s;
    ll cntr = 0, cntg = 0, cntb = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == 'R') cntr ++;
        else if (s[i] == 'G') cntg ++;
        else cntb ++;
    }
    ll ans = cntb * cntg * cntr;
    for (int i = 0; i <= n - 3; i++) { // len == 3   3-3==0   1, 2
        for (int j = i + 1; j <= n - 2; j++) {// len == 3  3-2 == 1  0 1 2 
            int p = 2 * j - i;
            if (p >= n) break;
            if (s[i] != s[j] && s[i] != s[p] && s[j] != s[p]) --ans;
        }
    }
    cout << ans << endl;
    return 0;
}
/*
4
RRGB
39
RBRBGRBGGBBRRGBBRRRBGGBRBGBRBGBRBBBGBBB
*/


Select Half


题目描述


Given is an integer sequence A1,…,AN of length N.

We will choose exactly ⌊N/2⌋ elements from this sequence so that no two adjacent elements are chosen.

Find the maximum possible sum of the chosen elements.

Here ⌊x⌋ denotes the greatest integer not greater than x.


Constraints

·2≤N≤2×105

·|Ai|≤109

·All values in input are integers.


输入


Input is given from Standard Input in the following format:

N

A1 … AN


输出


Print the maximum possible sum of the chosen elements.


样例输入 Copy


【样例1】

6
1 2 3 4 5 6


【样例2】

5
-1000 -100 -10 0 10


【样例3】

10
1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000


【样例4】

27
18 -28 18 28 -45 90 -45 23 -53 60 28 -74 -71 35 -26 -62 49 -77 57 24 -70 -93 69 -99 59 57 -49


样例输出 Copy


【样例1】

12

【样例2】

0

【样例3】

5000000000

【样例4】

295


提示


样例1解释:Choosing 2, 4, and 6 makes the sum 12, which is the maximum possible value.


在n个数中选择n/2个数,下取整,选择的数不能相邻,比如选择了i号位置的数字之后,i-1以及i+1都不能选择

dp前缀和优化

typedef int itn;
int n, m;
ll a[maxn];
ll pre[maxn];
ll dp[maxn];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        a[i] = read;
        if (i == 1) pre[i] = a[i];
        else pre[i] = pre[i - 2] + a[i];
    }
    for (int i = 2; i <= n; i++) {
        if (i % 2) dp[i] = max(dp[i - 1], dp[i - 2] + a[i]);
        else dp[i] = max(dp[i - 2] + a[i], pre[i - 1]);
    }
    cout << dp[n] << endl;
    return 0;
}


心灵的抚慰


题目描述


病毒问题解决后,神牛们的心灵久久不能平静。他可以从一个程序联想到一些相似的程序。比如从程序1联想到2,从2联想到4,从4联想到6,从6联想到9……就像搜索一样一步一步越陷越深。不过同一种联想他只会联想一次。比如1、2之间他进行了一次联想,那么他不会再重新联想1到2,或2到1。如果他刚开始时想到的程序能够经过联想若干次后联想回到原程序,那不就乱回来了吗?由于神牛马上就要开乱,请在1秒内告诉他,他需要想哪个程序,以便乱回来。

给出一些程序和他们互相联想的关系(如果两个程序A、B有联系,神牛可以从A联想到B,也可以从B联想到A,但A、B之间神牛最多联想一次),请告诉神牛他需要想哪个程序,以便在最短的时间内乱回来,并输出这个最短时间。


输入


第一行有两个正整数N,M,分别表示程序个数和有多少对程序可以被神牛直接互相联想。

以下M行,每行三个正整数,分别表示一种联想的两端的程序的编号(从1开始),以及进行这种联想所需要的最短时间(≤3500)。


输出


如果神牛无论如何都再也乱不回来了,输出“He will never come back.”。

如果神牛能够乱回来,请输出神牛会乱多长时间。


样例输入 Copy


4 3
1 2 10
1 3 20
1 4 30


样例输出 Copy


He will never come back.


提示


对于100% 的数据,n≤250。

弗洛伊德求最小环

int n, m;
ll dis[307][307];
ll val[307][307];
ll ans = INF;
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) dis[i][j] = INF, val[i][j] = INF;
    }
    for (int i = 1; i <= m; i++) {
        ll u = read, v = read, w = read;
        val[u][v] = min(val[u][v], w);
        val[v][u] = min(val[v][u], w);
        dis[u][v] = min(dis[u][v], val[u][v]);
        dis[v][u] = min(dis[v][u], val[v][u]);
    }
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= k - 1; i++) {
            for (int j = 1 + i; j <= k - 1; j++) {
                ans = min(ans, dis[i][j] + val[j][k] + val[k][i]);
            }
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
            }
        }
    }
    if (ans == INF) puts("He will never come back.");
    else cout << ans << endl;
    return 0;
}
/*
4 3
1 2 10
1 3 20
1 4 30
*/




目录
相关文章
|
8月前
|
机器学习/深度学习 索引
PTA-猴子选大王
程序模拟了猴子报数选猴王的过程,初始有N只猴子(N≤1000),从1号开始按1到3报数,报到3的猴子退出,直至只剩一只猴子,该猴子成为猴王。输入示例为11,输出示例为7。代码通过初始化猴子列表和当前报数索引,不断移除报数为3的猴子,最后返回剩余猴子的编号。
53 0
|
7月前
【洛谷 P1781】宇宙总统 题解(高精度+结构体排序)
在宇宙总统竞选中,需计算得到最高票者。程序接收$n$($1\leq n\leq 20$)个候选人及其票数,使用自定义比较器`cmp`对结构体数组`vote`按票数长度排序。样例输入5人,票数分别为98765、12365、87954、1022356、985678,输出显示编号为4的候选人(票数1022356)获胜。代码中,结构体`S`包含候选人ID和票数字符串,通过`sort`函数及`cmp`函数按票数长度降序排列,输出首位即为胜者。
45 0
|
8月前
|
存储
每日一题啦(● ̄(エ) ̄●)(尼克切斯定理,等差数列)
每日一题啦(● ̄(エ) ̄●)(尼克切斯定理,等差数列)
37 0
upc 2021秋组队训练赛第二场
upc 2021秋组队训练赛第二场
68 1
upc 2021秋组队训练赛第二场
|
机器学习/深度学习 人工智能
【寒假每日一题】AcWing 4509. 归一化处理
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 1、cmath头文件相关函数 2、cout大法
124 0
|
机器学习/深度学习 Java C++
【寒假每日一题】AcWing 4818. 奶牛大学(补)
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
101 0
|
人工智能 BI
【寒假每日一题】AcWing 4699. 如此编码
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
54 0
|
人工智能
UPC2021个人训练赛第39场 C: 粉兔找妹子(换根dp)
UPC2021个人训练赛第39场 C: 粉兔找妹子(换根dp)
104 0
UPC2021个人训练赛第39场 C: 粉兔找妹子(换根dp)
UPC-篮球运动(线性DP)
UPC-篮球运动(线性DP)
95 0
UPC-篮球运动(线性DP)

热门文章

最新文章

相关实验场景

更多