CF1605 总结

A A.M. Deviation

在三元组\(a_1,a_2,a_3\)上定义d运算:\(d=|a_1+a_3-2a_2|\).

可以做任意多次如下操作:

选择\(a_1,a_2,a_3\)中两个数,将其分别+1和-1.

对于给定的\(a_1,a_2,a_3\) ,最小化\(d\) 的值.

容易发现结果只可能是0/1,只与和有关.

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    int T=0;
    cin>>T;
    while (T--){
        int a=0,b=0,c=0;
        cin>>a>>b>>c;
        if ((a+b+c)%3==0)
          cout<<0<<endl;
        else
          cout<<1<<endl;
    }
}

B Reverse Sort

给定一个01串,每次进行如下操作:

选择串中任意个数,它们形成不升序列,将它们对称翻转.

问将原序列变为不降序列的最少操作数.输出方案.

容易发现最多也只需要一次翻转,只需要找到左边的1和右边的0一样多的位置翻转即可.

代码写的很丑...

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1005;
int cnt,tot,a[N],n;
char c;
bool flag;
int main(){
    int T;
    cin>>T;
    while (T--){
        cnt=0,tot=0,flag=true;
        cin>>n;
        for (int i=1;i<=n;i++){
            cin>>c;
            a[i]=c-'0';
            if (a[i]==1) tot++;
            if (i!=1&&a[i]==0&&a[i-1]==1) {
                flag=false;
            }
        }
        if (tot==0||tot==n||flag){
            cout<<0<<endl;
            continue;
        }
        cout<<1<<endl;
        for (int i=n;i>1;i--){
            if (a[i]==1)
              tot--;
            else 
              cnt++;
            if (tot==cnt){
                cout<<tot+cnt<<" ";
                for (int j=1;j<=i-1;j++)
                  if (a[j]==1)
                    cout<<j<<" ";
                for (int j=i;j<=n;j++)
                  if (a[j]==0)
                    cout<<j<<" ";
                cout<<endl;
                break;
            } 
        }
    }
}

总结

深夜打比赛,状态很差,仅做出两题,rk5000+,不太理想.

以后赛前要多睡觉.

上一篇:NOIP模拟52


下一篇:图论学习笔记 - 链表与邻接表