第一次做Codeforces,比赛的时候AC了前两道,然后,C题没仔细看输出说明...导致不知道该如何下手,直接放弃了这道题,其实这题还是蛮简单的。于是,就去攻D题了,但是一直WA在第三组数据。。最终rating掉了47,哎,要是仔细看C题的话,就肯定是涨rating的了。
总的来说,熬夜做CF还是蛮有意思的,以后每场CF必打,加油!
下面进入正题:
A题--Asphalting Roads
题目大意:给一个n*n的区域涂沥青,如果该点的行或者列之前涂过,这个点就不用涂了,升序输出需要涂沥青的点。
分析:好吧,其实题目本身写的有些不好懂,然而sample还是比较好理解的,所以直接看样例做题啦。这题就直接暴力,我写的题意基本上就已经分析好了。
代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 55;
bool row[55], col[55]; //表示某行某列是否已经涂过沥青
int ans[11111];
int main() {
int n;
while(~scanf("%d", &n)) {
int cnt = 0;
for(int i = 1; i <= n*n; i++) {
int a, b;
scanf("%d%d", &a, &b);
if(!row[a] && !col[b]) {
ans[cnt++] = i;
row[a] = col[b] = 1;
}
}
for(int i = 0; i < cnt; i++)
printf("%d%c", ans[i], i == cnt-1 ? '\n' : ' ');
}
return 0;
}
B题--Robot's Task
题目大意:有个机器人要破解所有计算机,破解第i台计算机前,需要破解a[i]台其他计算机。机器人起始位置在1,问破解所有计算机最少需要改变方向多少次。
分析:一直从一头扫到另一头就好了,然后再从另一头往回扫,直到破解了所有计算机。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[1111];
bool vis[1111];
bool dir;
int main() {
int n;
while(~scanf("%d", &n)) {
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
int sum = 0, cnt = 0;
dir = 1;
int ans = 0;
memset(vis, 0, sizeof(vis));
while(1) {
if(dir == 1) {
for(int i = 0; i < n; i++) {
if(!vis[i] && sum >= a[i]) {
vis[i] = 1;
sum++;
}
}
dir = 0;
}
else {
for(int i = n-1; i >= 0; i--) {
if(!vis[i] && sum >= a[i]) {
vis[i] = 1;
sum++;
}
}
dir = 1;
}
if(sum == n) break;
else ans++;
}
printf("%d\n", ans);
}
return 0;
}
C题--GCD Table
题目大意:由n个数可以构成一个n*n的gcd矩阵,对角上就是这n个数。现在按任意顺序给出这n*n个数,然后,输出构成矩阵的n个数,顺序随意!(就是随意这句没看到。导致无从下手)
分析:每次选最大的数,然后除了第一次选数的时候,之后每次都在原序列中去掉,这个数与集合中已有数的gcd,共两个,因为上下三角各有一个。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int a[550*550];
map<int, int> p;
vector<int> ans;
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a%b);
}
int main() {
int n;
while(~scanf("%d", &n)) {
p.clear();
for(int i = 0; i < n*n; i++) {
scanf("%d", &a[i]);
p[a[i]]++;
}
sort(a, a+n*n);
ans.clear();
for(int i = n*n-1; i >= 0; i--) {
if(!p[a[i]]) continue;
p[a[i]]--;
for(int j = 0; j < ans.size(); j++)
p[gcd(a[i], ans[j])] -= 2;
ans.push_back(a[i]);
}
for(int i = 0; i < n; i++)
printf("%d%c", ans[i], i == n-1 ? '\n' : ' ');
}
return 0;
}