Codeforces Round #571 (Div. 2)

A. Vus the Cossack and a Contest

签到题,比较一下m,k只要之中小的大于等于n就可以

# include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,m,k;

    cin>>n>>m>>k;

    int minn;

    minn=min(m,k);

    if(minn>=n){
        cout<<"Yes";
    }else{
        cout<<"No";
    }

    return 0;
}

C. Vus the Cossack and Strings

就是要比较b和a的子串有多少个相同的位数,如果是而数位就可以。如果暴力会T。
首先向一个问题,就是,如果把b和a的某个子串异或得到的串,在自己一维一位异或,那么什么时候得到0,什么时候得到1。答案是,如果有奇数个1那么是1,其余时候都是0(可以从1和0的奇偶个数去考虑)。
然后用第一个样例来解释,
(0 ^ 0) ^ (1 ^ 0) ^ ( 1 ^ 1 ) ^ ( 0 ^ 1 ) ^ ( 0 ^ 0) 这是第一次异或,然后 第二次异或是酱紫的(下方llllll,不用管,为了上下对齐)
llllll( 0 ^ 1) ^ ( 0 ^ 1 ) ^ ( 1 ^ 0 ) ^ ( 1 ^ 0 ) ^ ( 0 ^ 0 )
将两次比较一下可以得到第二次比第一次多了一个
第三次异或只不过是位置错位了,没有相邻,但是计算结果是一样的,(感兴趣的朋友可以推一下,就是消除了,上一轮的a的第一个数,然后在末尾加上了该轮的最后一个数)
参考博客

# include <bits/stdc++.h>
using namespace std;

int main()
{
    string a,b;

    cin>>a>>b;

    int a_len=a.length();
    int b_len=b.length();

    int ans=0;
    int sum=0;

    for(int i=0;i<b_len;i++){
        ans=ans^(a[i]-'0')^(b[i]-'0');
    }
    //printf("@@%d\n",ans);
    if(ans==0) sum++;

    for(int i=b_len;i<a_len;i++){
        ans=ans^(a[i]-'0')^(a[i-b_len]-'0');
        if(ans==0) sum++;
        //printf("@@%d\n",ans);
    }

    printf("%d",sum);
    return 0;
}

D. Vus the Cossack and Numbers

就是选择对一个数向上取整还是向下取整,可以这样子考虑,就是对这个数(如果不是刚好小数部分全部为0的话,都为0只有一种情况就是自身)有两种情况,就是与该小数相差为1之内的两个数。然后我们可以试着把小的那个数全部加起来,然后看和0相差多少,然后用大的那个数去修正

# include <bits/stdc++.h>
using namespace std;

const int MAXN=1e5+100;
double a[MAXN];
int c[MAXN];
int d[MAXN];
int sum1=0,sum=0;
int main()
{

    int n;
    cin>>n;

    for(int i=1;i<=n;i++){
        cin>>a[i];
        c[i]=(int)a[i];
        if(a[i]==c[i]){
            d[i]=c[i];
        }else{
            if(a[i]>=0) d[i]=c[i]+1;
            else d[i]=c[i]-1;
        }
        if(c[i]>d[i]){
            int t=c[i];
            c[i]=d[i];
            d[i]=t;
        }
        sum1+=c[i];
        //printf("%d %d\n",c[i],d[i]);
    }
    if(sum1==0){
        for(int i=1;i<=n;i++){
            printf("%d\n",c[i]);
        }
    }else{
        for(int i=1;i<=n;i++){
            if(d[i]>c[i]&&sum1<0){
                printf("%d\n",d[i]);
                sum1++;
            }else{
                printf("%d\n",c[i]);
            }
        }
    }


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值