556A - Case of the Zeros and Ones
0,1是配对的,消耗多少个0,就会消耗多少个1
#include<bits/stdc++.h>
using namespace std;
int a[2];
int x;
int main()
{
int n;
scanf("%d",&n);
a[0]=a[1]=0;
string s;
cin>>s;
for(int i=0;i<n;i++){
a[s[i]-'0']++;
}
int num=min(a[0],a[1]);
printf("%d\n",n-2*num);
}
分析:
判断经过n此操作,链子会不会形成从0-n-1的齿轮排列。
其实给定齿轮初始化排列以后,每按一次齿轮排列的顺序是一定的,在按n次以后又回到原来的初始状态,所以只需保存起来按第 i 次时每个齿轮的转态,最后循环判断是否存在一个序列是0-n-1就可以了
#include<bits/stdc++.h>
using namespace std;
int n,a[1002][1002];
int main()
{
while(cin>>n){
bool flag=1;
for(int i=0;i<n;i++){
cin>>a[i][0];
int t=a[i][0];
if(flag){
for(int j=1;j<n;j++){
if(t<=0)t=n;
a[i][j]=--t;
}
flag=0;
}
else {
for(int j=1;j<n;j++){
if(t>=n-1)t=-1;
a[i][j]=++t;
}
flag=1;
}
}
flag=1;
for(int i=0;i<n;i++){
if(a[0][i]==0){
for(int j=1;j<n;j++){
if(a[j][i]!=j){
flag=0;break;
}
} break;
}
}
if(flag)printf("Yes\n");
else printf("No\n");
}
}
555A - Case of Matryoshkas
分析:
这题的题意是有误区的,本来以为应经套起来的是可以套在另一个的,在WA了以后发现是不可以的,必须从小的往大的套,也就是说,只有从 1 开始的一段链子是不需要拆开的,而其他的必须拆成单个来重新查起来
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k,m,x,y;
while(cin>>n>>k){
int p=k;
int cnt=0;
while(p--){
scanf("%d",&m);
cnt+=m-1;
scanf("%d",&x);
if(x==1)
for(int i=1;i<m;i++){
scanf("%d",&x);
if(x==i+1)cnt--;
}
else {
m--;
while(m--)
scanf("%d",&x);
}
}
cout<<cnt+cnt+k-1<<endl;
}
}