Codeforces Round #288 (Div. 2)

学长让去做CF的题,就把前几天的那场做了两道。

508A - Pasha and Pixels:

给出nm的像素,每次选一块,变成黑色,判断有没有出现22的黑像素,输出是第几次出现的。

思路很简单,点一个判断一次就好了。一开始用关了流同步的cin和cout,运行140ms,后来换scanf和printf,运行46ms,差了3倍多。原本以为关 掉同步之后差不了多少,没想到差这么多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<cstdio>
#include<cstring>
const int maxn=1010;
bool g[maxn][maxn];
bool judge(int a,int b){
if(g[a+1][b]&&g[a][b+1]&&g[a+1][b+1]) return 1;
if(g[a+1][b]&&g[a][b-1]&&g[a+1][b-1]) return 1;
if(g[a-1][b]&&g[a][b+1]&&g[a-1][b+1]) return 1;
if(g[a-1][b]&&g[a][b-1]&&g[a-1][b-1]) return 1;
return 0;
}
int main(){
int n,m,k,i;
while(~scanf("%d%d%d",&n,&m,&k)){
memset(g,0,sizeof(g));
bool flag=1;
for(i=0;i<k;++i){
int a,b;
scanf("%d%d",&a,&b);
g[a][b]=1;
if(flag&&judge(a,b)){
printf("%d\n",i+1);
flag=0;
}
}
if(flag) printf("0\n");
}
return 0;
}

508B - Anton and currency you all know:

输入一个奇数,输出交换两位后最大的偶数,没有的话输出-1。

单次循环,寻找最大的位置,flag标记偶数位,flag2标记能否生成偶数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[100010];
int main(){
while(~scanf("%s",s)){
int n=(int)strlen(s);
int p=0,flag=1,flag2=1;
for(int i=0;i<n;++i){
if(!(s[i]&1)){
p=i,flag2=0;
if(s[i]<s[n-1]){
swap(s[i],s[n-1]);
flag=0;
break;
}
}
}
if(flag) swap(s[p],s[n-1]);
if(flag2) printf("-1\n");
else printf("%s\n",s);
}
return 0;
}

** 本文迁移自我的CSDN博客,格式可能有所偏差。 **