• Codeforces Round #821 (Div. 2) A~C(模拟、构造)


    A. Consecutive Sum

    普通的签到

    简而言之就是把每个数的index mod k的余数相同的数字中取最大值,然后不同余数的最大值加起来就可以了

    注意取最大值的时候要初始化,以及开long long

    1. #include
    2. using namespace std;
    3. #define int long long
    4. int v[104];
    5. signed main()
    6. {
    7. int t,a;cin>>t;
    8. while(t--){
    9. int n,k;int sum=0;cin>>n>>k;
    10. memset(v,0,sizeof(v));
    11. for(int i=1;i<=n;i++){cin>>a;v[i%k]=max(v[i%k],a);}
    12. for(int i=0;i
    13. cout<
    14. }
    15. return 0;
    16. }

    B. Rule of League

    题意:一共有n-1场比赛,每个人胜利了x次或者y次,问比赛的每场情况谁赢了

    思路:做了一会才发现,因为第一场比赛1和2比,总会有一个人的胜利次数为0所以如果x和y有且只有一个0的时候才会有比赛结果

    之后就是硬模拟了

    1. #include
    2. using namespace std;
    3. #define int long long
    4. signed main()
    5. {
    6. int t;cin>>t;int n,a,b;
    7. while(t--){
    8. cin>>n>>a>>b;
    9. if(a==0&&b==0)cout<<"-1\n";
    10. else if(a==0||b==0){
    11. if((n-1)%max(a,b)==0){
    12. int flag=1;int cou=0;
    13. for(int qq=2;qq<=n;qq++){
    14. cout<" ";cou++;
    15. if(cou==max(a,b)){flag=qq+1;cou=0;}
    16. }
    17. cout<
    18. }
    19. else cout<<"-1\n";
    20. }
    21. else cout<<"-1\n";
    22. }
    23. return 0;
    24. }

    C. Parity Shuffle Sorting

    题意:

    • Choose two indices l and r (1≤l
    • If al+ar is odd, do ar:=al. If al+ar is even, do al:=ar.
    • 求最后不下降序列
    • 输出操作的序号(不要求最小步骤)

    思路:

    1.a[0] 等于 a[n] 或者 a[n] 等于 a[0]

    2.若 a[0]+a[i] 是奇数,a[i]=a[0];否则偶数的话,a[i] = a[n-1];

    3.记录下答案,之后输出就可以了

    (比赛的时候还以为只能是相邻的选择,不过就算读对题了也不一定想到orz)

    1. #include
    2. using namespace std;
    3. #define int long long
    4. int n,a[200005],b;
    5. signed main()
    6. {
    7. int t;cin>>t;
    8. while(t--){
    9. int n;cin>>n;
    10. for(int i=1;i<=n;i++)cin>>a[i];
    11. vectorint,int>>v;
    12. if(n==1){cout<<0<continue;}
    13. if((a[1]+a[n])%2==1)a[n]=a[1];
    14. else a[1]=a[n];
    15. v.push_back({1,n});
    16. for(int i=2;i<=n-1;i++){
    17. if((a[1]+a[i])%2==1){a[i]=a[1];v.push_back({1,i});}
    18. else if((a[n]+a[i])%2==0){a[i]=a[n];v.push_back({i,n});}
    19. }
    20. cout<size()<
    21. for(int i=0;isize();i++){
    22. cout<" "<
    23. }
    24. }
    25. return 0;
    26. }

    D1. Zero-One (Easy Version)

    题意:

    1.给两个01串a和b,字符串长度大于等于5,选择两个在字符串a中的两个字符

    2.对这两个字符进行0变1和1变0这两个操作,使得a==b

    3.如果这两个字符是相邻的,那么花费x;如果不相邻,那么花费y。(y

    4.求最小费用

    思路:

    1.首先容易看出字符串a如果有奇数个字符和字符串b不一样,那么输出不可能。

    2.如果字符串a只有两个相邻的字符和b不一样,那么它有两个操作:1)花费x直接变换。2)花费2*y,两次都和同一个第三个字符变化。这两个操作取最小值就可以。

    ***3.剩下的其他情况无论怎么样都可以化作用y的方式去做。

    ( 第3点是比赛的时候我没想到的orz ) 

    代码:

    1. #include
    2. using namespace std;
    3. #define int long long
    4. signed main()
    5. {
    6. int t;int n,x,y;cin>>t; string a,b;
    7. while(t--){
    8. cin>>n>>x>>y;cin>>a>>b;a=" "+a;b=" "+b;
    9. vector<int>v;int co=0;int sum=0;
    10. for(int i=1;i<=n;i++){
    11. if(a[i]!=b[i])co++;
    12. else if(co!=0){v.push_back(co);sum+=co;co=0;}
    13. }
    14. if(co){v.push_back(co);sum+=co;}
    15. if(sum%2==1)cout<<-1<
    16. else if(v.size()==1&&v[0]==2)cout<<min(x,2*y)<
    17. else cout<2*y<
    18. }
    19. return 0;
    20. }

  • 相关阅读:
    无线网络性能该如何检测?
    lua-总结2
    Node的http模块
    IDEA2020.3无法输入中文问题解决
    Hadoop Hive介绍
    Java21 LTS版本
    Java 线程常用操作
    2024年PMP考试英文报名时间和流程,建议收藏
    运筹说 第66期|贝尔曼也有“演讲恐惧症”?
    xgp怎么取消续费 微软商店xgp会员取消自动续费详细教程
  • 原文地址:https://blog.csdn.net/zy98zy998/article/details/126946088