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;
}