A
题目链接
http://codeforces.com/contest/699/problem/A
题意
有些粒子向左飞,有些粒子向右飞,问最先碰到一起的粒子的时间。
题解
虽然是水题,但还是考虑漏了一些东西,WA了两发…只有RL这种情况才可以碰到,R遇到R要更新,L遇到R要更新。[自己蠢了,只需要寻找相邻的RL组合即可,比较取最小值]
代码
#include<bits/stdc++.h>
using namespace std;
int a[200005];
int main()
{
int n;
scanf("%d",&n);
string st;
cin>>st;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int ans=1e9+9;
int ok=0;
char b=st[0];
int op=0;
for(int i=1;i<n;i++)
{
if(b=='R'&&st[i]=='L'){ok=1;int t=(a[i]-a[op])/2;ans=min(ans,t);b='0';}
if(b=='0'&&st[i]=='R'){op=i;b='R';}
if(b=='R'&&st[i]=='R'){op=i;}
if(b=='L'&&st[i]=='R'){op=i;b='R';}
}
if(ok==0)printf("-1\n");
else printf("%d\n",ans);
return 0;
}
B
题目链接
http://codeforces.com/contest/699/problem/B
题意
是否存在一个点,可以把所有的墙全部爆掉,这个点可以是空的,也可以是有墙的。
题解
把墙所在的行与列单独分出来,然后遍历所有的点,寻找满足点所在行与列的墙数之和等于总的墙数的,需要注意如果所在点是墙的话,则是总的墙数减1。
对了还有个奇坑,连续两个scanf读入数据,如果第二个scanf读入char类型的话,会读入一个\n…[吃鲸]…mdzz 但是换成%s读入就没有问题。。
代码
#include<bits/stdc++.h>
using namespace std;
char c[1002][1002];
int main()
{
int row[1005];
int col[1005];
int n,m;
cin>>n>>m;
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
int cnt=0;
//fflush(stdin);
char s[1005];
for(int i=1;i<=n;i++)
{ scanf("%s",s+1);
for(int j=1;j<=m;j++)
{
c[i][j]=s[j];
if(s[j]=='*')
{ cnt++;
row[i]++;
col[j]++;
}
}
}
int ok=0,ans1,ans2;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(row[i]+col[j]==cnt&&c[i][j]=='.'){ok=1;ans1=i;ans2=j;break;}
if(row[i]+col[j]==cnt+1&&c[i][j]=='*'){ok=1;ans1=i;ans2=j;break;}
}
}
if(ok==1){printf("YES\n");printf("%d %d\n",ans1,ans2);}
else printf("NO\n");
return 0;
}
C
题目链接
http://codeforces.com/contest/699/problem/C
题意
程序猿要运动要码代码,要休息。但是他不会连续两天干同一件事,除了休息。问他最少可以休息几天。
题解
把3处理成1或2,然后根据连续的1或2,rest[休息时间]++,我们要尽可能地多干活,如果3的前一天是1那么3转换为2,是2转换为1,若是0,则要根据后面的一个非3且非0的天的情况决定,间隔奇数天则该天是2则3转换为1,1转换为2,偶数天则该天是2则3转换为2,同理1。注意单独处理第一天的是3的情况。注意咯,不能把3单独处理完全后再遍历连续两天的情况,因为连续两天的情况第二天是等同于0,这样会影响3的处理情况。。PS要仔细把所有情况考虑周全呀,有些特例也要处理完全才行。
代码
#include<bits/stdc++.h>
using namespace std;
typedef struct qz{
int jj;
int write,gym;
};
int a[105];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int t;
scanf("%d",&t);
a[i]=t;
}
int rest=0;
if(a[0]==0)rest++;
if(a[0]==3)
{
int j=1;
while(a[j]==3||a[j]==0)
{
j++;
}
if((j-0)%2==0)a[0]=a[j];
else {if(a[j]==1)a[0]=2;
else a[0]=1;}
}
for(int i=1;i<n;i++)
{
if(a[i]==3)
{
if(a[i-1]==1)a[i]=2;
else if(a[i-1]==2)a[i]=1;
else if(a[i-1]==0)
{
int j=i+1;
while(a[j]==3||a[j]==0)
{
j++;
}
if((j-i)%2==0)a[i]=a[j];
else {if(a[j]==1)a[i]=2;
else a[i]=1;
}
}
}
if(a[i]==0)rest++;
else if(a[i]==a[i-1]){a[i]=0;rest++;}
}
printf("%d\n",rest);
return 0;
}
在附另外一份代码,QAQ好强
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int num[105];
int main()
{
int n, ans = 0;
cin>>n;
for(int i = 1;i <= n;i ++)
{
scanf("%d", &num[i]);
if(num[i] == 0)
ans++;
}
for(int i = 1;i <= n;i ++)
{
if(num[i] == 1 && num[i+1] == 1)
{
ans++;
num[i+1] = 0;
}
else if(num[i] == 2 && num[i+1] == 2)
{
ans++;
num[i+1] = 0;
}
else if(num[i] == 2 && num[i+1] == 3)
{
num[i+1] = 1;
}
else if(num[i] == 1 && num[i+1] == 3)
{
num[i+1] = 2;
}
}
cout<<ans<<endl;
return 0;
}