首页 > 其他分享 >Codeforces Round 909 (Div. 3)

Codeforces Round 909 (Div. 3)

时间:2023-12-09 18:22:56浏览次数:42  
标签:int scanf 909 Codeforces ++ while printf Div include

https://codeforces.com/contest/1899

 

 

一个小游戏

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

int n;

int main() {
    cin >> n;
    
    while(n -- ) {
        int x;
        cin >> x;
        if((x + 1) % 3 == 0 || (x - 1) % 3 == 0) {
            cout << "First" << endl;
        } else {
            cout << "Second" << endl;
        }
    }
    
    
    return 0;
}

 

 

 将数组分成k分,使绝对值差值最大

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>

using namespace std;

const int N = 150010;

typedef long long LL;

int n;
int a[N];
LL s[N];

int main() {
    int T;
    scanf("%d", &T);
    
    while(T -- ) {
        memset(s, 0, sizeof s);
        scanf("%d", &n);
        for(int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
        for(int i = 1; i <= n; i ++ ) s[i] = s[i - 1] + a[i];
        LL res = 0;
        for(int k = 1; k <= n / 2; k ++ ) {
            if(n % k == 0) {
                LL mi = 1e18, mx = 0;
                for(int j = k; j <= n; j += k) {
                    mi = min(mi, s[j] - s[j - k]);
                    mx = max(mx, s[j] - s[j - k]);
                }
                res = max(res, mx - mi);
            }
        }
        cout << res << endl;
    }
    
    return 0;
}

 

 

 

 找一个和最大的子数组,要求相邻的元素不能有相同的奇偶性

 简单动态规划问题,另f[i]表示以第i项为结尾的,满足条件的最大子序列和。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 2e5 + 10;

int n;
int a[N], f[N];

int main() {
    int T;
    scanf("%d", &T);
    
    while(T -- ) {
        scanf("%d", &n);
        for(int i = 0; i < n; i ++ ) scanf("%d", &a[i]), f[i] = a[i];
        for(int i = 1; i < n; i ++ ) {
            if(((a[i] & 1) == (a[i - 1] & 1))) continue;
            f[i] = max(f[i], f[i - 1] + a[i]);
        }
        
        int mx = -1e8;
        for(int i = 0; i < n; i ++ ) mx = max(mx, f[i]);
        printf("%d\n", mx);
    }
    
    
    return 0;
}

 

 

 推公式,按照题目给的条件进行化简即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>

#define LL long long

using namespace std;

const int N = 2e5 + 10;

inline int read(){
    int r = 0,w = 1;
    char c = getchar();
    while (c < '0' || c > '9'){
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9'){
        r = (r << 3) + (r << 1) + (c ^ 48);
        c = getchar();
    }
    return r * w;
}

int main() {
    
    int n;
    int T = read();
    LL res;
    int x;
    map<int, int> mp;
    map<int,int>::iterator it;
    while(T -- ) {
        res = 0;
        scanf("%d", &n);
        
        mp.clear();
        for(register int i = 0; i < n; ++ i) {
            x = read();
            ++ mp[x];
        }
        
        // 注意这里不能次次声明,会被卡住
        for(it = mp.begin(); it != mp.end(); ++it) {
            res += it -> second * 1ll * (it -> second - 1) / 2;
        }
        
        res += mp[1] * 1ll * mp[2];
        printf("%lld\n", res);
        
    }    
    
    
    return 0;
}

 

 

 贪心,找规律。

我们要得到一个非降序的的序列,操作二可以把小的前移,直到大于等于前一个元素。若我们一直执行操作二,最后会得到一个类似于样例1的序列,然后进行操作一,将大元素插到末尾即可。

在此过程中,如果最小值前面有山峰状数组及形如 3 4 2 的子序列,则无解。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>

using namespace std;

const int N = 2e5 + 10;

int main() {
    int T;
    scanf("%d", &T);
    int a[N];
    int n;
    
    while(T -- ) {
        scanf("%d", &n);
        for(int i = 0; i < n; i ++ ) scanf("%d", &a[i]);    
        int mi = INT_MAX, p = -1;
        for(int i = 0; i < n; i ++ ) {
            if(a[i] < mi) {
                mi = a[i];
                p = i;
            }
        }
        
        bool flag = true;
        for(int i = p; i < n - 1; i ++ ) {
            if(a[i] > a[i + 1]) {
                flag = false;
                break;
            }
        }
        if(flag) printf("%d\n", p);
        else printf("%d\n", -1);
        
    }
    
    
    return 0;
}

 

https://codeforces.com/contest/1899/problem/F

 

 贪心,维护一条链,让链尾部最后一个节点进行移动即可满足题目条件。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 510;

int n, q;
int a[N];

int main() {
    int T;
    scanf("%d", &T);
    int len;
    while(T -- ) {
        scanf("%d%d", &n, &q);
        len = n - 1;
        for(int i = 0; i < q; i ++ ) {
            scanf("%d", &a[i]);
        }
        
        for(int i = 1; i < n; i ++ ) {
            printf("%d %d\n", i, i + 1);
        }
        int f = n - 1;
        for(int i = 0; i < q; i ++ ) {
            if(a[i] == f) {
                printf("%d %d %d\n", -1, -1, -1);
            } else {
                printf("%d %d %d\n", n, f, a[i]);
                f = a[i];
            }
        }
        
    }
    
    return 0;
}

 

最后一题太难,贴个链接有空再说:https://codeforces.com/contest/1899/problem/G

 

标签:int,scanf,909,Codeforces,++,while,printf,Div,include
From: https://www.cnblogs.com/zk6696/p/17891270.html

相关文章

  • [Codeforces] CF1704C Virus
    CF1704CVirus题意有一个长度为\(n\)的环,即对于\(1\leqi\leqn\),满足第\(i\)个与第\(i+1\)个房子相邻,特别地,第\(n\)个房子与第\(1\)个房子也相邻。一开始,这\(n\)个房子中有\(m\)个房子被病毒感染了。在之后的每天早上,都可以选择一个未被感染的房子并对其进行保护,被保......
  • [Codeforces] CF1703E Mirror Grid
    CF1703EMirrorGrid题意给定一个\(n\timesn\(n\le100)\)的01矩形,求至少修改多少次后能使矩形旋转0°,90°,180°,270°后所形成的矩形都完全相同。思路吸纳分为两种情况讨论:\(n\)为奇数那么会出现这种情况:(以\(5\times5\)为例)如上图,我们就可以将其分为五个部分,每个......
  • Codeforces Round 811 (Div. 3)
    基本情况ABC秒了。DE都给了我希望,但都做不下去。两道题反复横跳,结果最后谁也没做出来。E还是比D亲切的,先补E吧。E.AddModulo10做的时候想着说对每个个位数的变化找找规律,但是没有进一步的发现。实际上就应该从这里下手。首先共识:相同的两个数经过操作后必然相同。分析......
  • Codeforces Round 913 (Div. 3)
    A.Rook打印出象棋车的下一步usingnamespacestd;voidsolve(){ strings; cin>>s; chara=s[0]; charb=s[1]; set<string>ans; for(chari='1';i<='8';i++){ stringt=""; t+=a; t+=i; ans.insert(t); } for(chari......
  • 【LGR-168-Div.4】洛谷入门赛 #18
    打表过样例题目描述很不幸,你遇到了不负责任的出题人。在某道试题里,共有\(N\)个测试点,组成了\(k\)个Subtask,第\(i\)个Subtask包含\(p_i\)个测试点,第\(j\)个测试点的编号为\(w_{i,j}\)。请注意,一个测试点可能属于多个Subtask。Subtask每个Subtask包含多个测......
  • 可以拖拽缩放的div
    一、HTML代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"content......
  • [ABC254Ex] Multiply or Divide by 2
    [ABC254Ex]MultiplyorDivideby2题意:给定大小为$n$的集合$A$和$B$,你可以对集合$A$中的元素$a_i$进行两种操作,分别为$a_i\leftarrow\lfloor\dfrac{a_i}{2}\rfloor$,和$a_i\leftarrowa_i\times2$。你需要操作集合$A$直至集合$A,B$完......
  • Codeforces Round 894 G
    玩一下样例就能知道这个是和每个seg的最大间隔相关为了好写我们可以直接写成元素间隔这样我们用两个multiset维护元素间隔以及元素即可注意删除的时候我们只删一个值需要删指针还有考虑长度为1的情况multiset<int>st,st1;voidErase(intx){autoit=st1.lower_bound......
  • Codeforces Round 913 (Div. 3)
    CodeforcesRound913(Div.3)比赛链接ROOK题目思路:我没有下过国际象棋,但这个题跟国际象棋真是没有一点关系,就是一个简单的输出代码:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){//intn;strings;cin>>s;in......
  • CodeForces 1901F Landscaping
    洛谷传送门CF传送门还是很有趣的一道题。场上直接暴拆式子,要维护动态凸包,本来以为是\(\log^2\)的,写着写着发现是\(\log^3\),遂弃。显然梯形面积最小等价于\(y_0+y_1\)最小,而\(y_0+y_1\)最小等价于梯形在\(m=\frac{n}{2}\)处最小。把上凸包建出来,发现过\(x=m......