A. Splitting into digits
http://codeforces.com/contest/1104/problem/A
被提示误导,搞不清楚状况的我,乱写了一发AC的,其实只要输出全1就好了
#include <bits/stdc++.h>
using namespace std;
//int pr[15]={0,0,1,1,0,1,0,1,0,0};
int main()
{
int n;
scanf("%d",&n);
int flag=1;
if(n==2)
{
printf("2\n1 1\n");
return 0;
}
if(n==3)
{
printf("3\n1 1 1\n");
return 0;
}
if(n==4)
{
printf("2\n2 2\n");
return 0;
}
if(n==5)
{
printf("5\n1 1 1 1 1\n");
return 0;
}
if(n==6)
{
printf("2\n3 3\n");
return 0;
}
if(n==7)
{
printf("7\n1 1 1 1 1 1 1\n");
return 0;
}
if(n==8)
{
printf("2\n4 4\n");
return 0;
}
if(n==9)
{
printf("3\n3 3 3\n");
return 0;
}
for(int i=2;i<=9;i++)
{
if(n%i==0)
{
flag=i;
}
}
int k=n/flag;
printf("%d\n",k);
for(int i=1;i<=k;i++)
{
if(i==1) printf("%d",flag);
else printf(" %d",flag);
}
printf("\n");
return 0;
}
B. Game with string
http://codeforces.com/contest/1104/problem/B
给你一个100000的字符串,都是小写字母,A和B每次删去连续相同的两个字母,直到删不掉为止。
问你最后谁赢
贪心的想法,找到最多能删多少次就好了
奇数输出Yes,偶数No
每次找到可以直接删的和删完后继续删的的对称的删除
注意可能要删好几次,直到不能直接找到连续的两个相同的为止
#include <bits/stdc++.h>
using namespace std;
char a[100005],c[1000005];
bool b[100005];
struct node
{
int w;
}d[100005];
int main()
{
scanf("%s",c+1);
int len=strlen(c+1);
for(int i=1; i<=len; i++)
{
a[i]=c[i];
}
int ans=0;
while(1)
{
int flag=0;
int len1=strlen(a+1);
if(len1<=1) break;
int left=1;
for(int i=2; i<=len1; i++)
{
if(a[i]==a[i-1]&&!b[i-1])
{
flag++;
int p=1;
int k=i-1-left;
int x=i-1,y=i;
for(int j=1; j<=k; j++)
{
if(a[x-j]!=a[y+j]) break;
if(y+j>len1) break;
else
{
b[x-j]=b[y+j]=1;
ans++,p++;
}
}
b[x]=b[y]=1;
ans++;
left=y+p;
i=y+p+1;
}
}
if(flag==0) break;
int tot=0;
memset(a,0,sizeof a);
for(int i=1; i<=len1; i++)
{
if(!b[i])
{
a[++tot]=c[i];
}
}
for(int i=1;i<=tot;i++)
{
c[i]=a[i];
}
memset(b,0,sizeof(b));
if(tot==0) break;
}
//cout<<ans<<endl;
if(ans%2) printf("Yes\n");
else printf("No\n");
return 0;
}
C. Grid game
http://codeforces.com/contest/1104/problem/C
给你一个长度为1000的01字符串,0表示竖放1*2方格,1表示横放,某行某列放满就清空
要求不重叠,输出每块放置的行列
就让竖放的放在一二行,横放的放在第三行,放满就清除就好了
#include <bits/stdc++.h>
using namespace std;
int b[6][6];
char a[1005];
int main()
{
scanf("%s",a+1);
int len=strlen(a+1);
memset(b,0,sizeof b);
for(int i=1;i<=len;i++)
{
if(a[i]=='0')
{
for(int j=1;j<=4;j++)
{
if(b[1][j]==0)
{
b[1][j]=1;
cout<<"1 "<<j<<endl;
//printf("1 %d\n",1,j);
if(j==4)
{
for(int k=1;k<=4;k++)
{
b[1][k]=0;
}
}
break;
}
}
}
else
{
if(!b[3][1])
{
b[3][1]=b[3][2]=1;
printf("3 1\n");
}
else
{
b[3][1]=b[3][2]=0;
printf("3 3\n");
}
}
}
return 0;
}
D. Game with modulo
http://codeforces.com/contest/1104/problem/D
有一个数n,系统每次询问你? a b,
你输出x代表,a%n>=b%n
否则输出y
要求在60次以内找到这个n
否则会判超时
从?0 1 返回x代表就是1
?1 2
?2 4
不断询问下去
如果返回x就是说明n在【2^i,2^(i+1)】
然后开始二分
老是TLE就是我在规定次数内没能跳出二分循环,输出答案
所以就让它跑29次,就ac了
第一道交互式的题目
在输出后面加上fflush(stdout);
#include <bits/stdc++.h>
using namespace std;
char s[10];
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
string opt;
while(1)
{
scanf("%s",s);
if(s[0]=='e'||s[0]=='m')
{
break;
}
if(s[0]=='s')
{
cout<<"? 0 1"<<endl;
fflush(stdout);
cin>>opt;
if(opt[0]=='x')
{
cout<<"! 1"<<endl;
fflush(stdout);
continue;
}
int l,r;
for(int i=0;i<=29;i++)
{
int x=(1<<i),y=(1<<(i+1));
cout<<"? "<<x<<" "<<y<<endl;
fflush(stdout);
cin>>opt;
if(opt[0]=='x')
{
l=x,r=y;
break;
}
}
int mid=1e15;
for(int i=1;i<=29;i++)
{
mid=(l+r)/2;
cout<<"? "<<l<<" "<<mid<<endl;
fflush(stdout);
cin>>opt;
if(opt[0]=='x')
{
r=mid;
}
else l=mid;
}
cout<<"! "<<l+1<<endl;
fflush(stdout);
}
}
return 0;
}