题目传送:Codeforces Round #303 (Div. 2)
这场题目比较简单,就最后一个题要好好想想
A. Toy Cars
思路:水
AC代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;
int a[105];
int cnt;
int main() {
int n;
scanf("%d", &n);
cnt = 0;
for(int i = 0; i < n; i ++) {
int flag = 1;
for(int j = 0; j < n; j ++) {
int t;
scanf("%d", &t);
if(t == 1 || t == 3) flag = 0;
}
if(flag) a[cnt ++] = i + 1;
}
printf("%d\n", cnt);
for(int i = 0; i < cnt; i ++) {
printf("%d ", a[i]);
}
return 0;
}
B. Equidistant String
题意:找一个字符串,使得他与给出的两个字符串的“距离相同”。具体做法看代码。
AC代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;
char s1[100005], s2[100005];
int main() {
scanf("%s %s", s1, s2);
int len = strlen(s1);
int cnt = 0;
for(int i = 0; i < len; i ++) {
if(s1[i] != s2[i]) cnt ++;
}
if(cnt & 1) {
printf("impossible\n");
}
else {
int m = cnt / 2;
for(int i = 0; i < len; i ++) {
if(s1[i] != s2[i]) {
if(s1[i] == '1') s1[i] = '0';
else s1[i] = '1';
m --;
}
if(m == 0) break;
}
printf("%s\n", s1);
}
return 0;
}
C. Woodcutters
思路:砍树,尽量砍得最多,贪心,尽量往左边砍。
AC代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;
const int maxn = 100005;
int x[maxn], h[maxn];
int main() {
int n;
scanf("%d", &n);
for(int i = 0; i < n; i ++) {
scanf("%d %d", &x[i], &h[i]);
}
int ans = 1;
int cur = -INF;
for(int i = 0; i < n - 1; i ++) {
if(i == 0) {
ans ++;
cur = x[i];
}
else if(x[i] - h[i] > cur && x[i] - h[i] > x[i - 1]) {
ans ++;
cur = x[i];
}
else if(x[i] > cur && x[i] + h[i] < x[i + 1]) {
ans ++;
cur = x[i] + h[i];
}
}
printf("%d\n", ans);
return 0;
}
D. Queue
思路:排下序然后贪心一下就ok了。
AC代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;
int a[100005];
int main() {
int n;
scanf("%d", &n);
for(int i = 0; i < n; i ++) {
scanf("%d", &a[i]);
}
sort(a, a + n);
LL ans = 1;
LL sum = a[0];
for(int i = 1; i < n; i ++) {
if(a[i] >= sum) {
ans ++;
sum += a[i];
//cout << sum << endl;
}
}
cout << ans << endl;
return 0;
}
E. Paths and Trees
待补...