A:http://codeforces.com/problemset/problem/545/A
题意:告诉你车的碰撞情况,求最后好的车剩几辆
思路:直接模拟
B:http://codeforces.com/problemset/problem/545/B
题意:输入两个等长字符串s和t,都只包含0和1。定义s和t的距离为s和t中相同位置i并且s[i]!=t[i]的个数。
比如0001和1011的距离为2。
求一个字符串p,与s的距离等于与t的距离。如果求不出来,输入impossible。
思路:先判断s和t的距离dis是否为偶数。若dis为奇数,则输出impossible。若dis为偶数,对位置i,如果s[i]==t[i],则p[i]=s[i];如果s[i]!=t[i],则p[i]=s[i]取dis/2个,p[i]=t[i]取dis/2个。
C
D:http://codeforces.com/problemset/problem/545/D
题意:n个人排队,每个人都有一个服务时间。若等待的时间超过了其服务时间,这个人就不满意,否则就是满意的。排在第i个的人,需要等待的时间为前i-1个人的服务时间之和。允许任意交换任何2个人的位置,求队伍中满意人数最多的人数。
思路:贪心。假设开始排第i个人,前i-1个人的总服务时间为sum,第i个人的服务时间要大于sum并且使得sum加上第i个人的服务时间后sum尽可能小,如果不行,则将这个人丢到队伍尾。可以将所有人的服务时间丢入一个优先队列(从小到大)。每次取出一个人,若这个人的服务时间大于sum,则sum加上这个人的服务时间,满意人数ok++。把这个人丢出队列。
代码如下。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
int main() {
int n;
while (scanf("%d", &n) != EOF) {
priority_queue<int, vector<int>, greater<int> > q;
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
q.push(x);
}
int ok = 0;
long long sum = 0;
while (q.size() > 0) {
if (q.top() >= sum) {
sum += q.top();
ok++;
}
q.pop();
}
printf("%d\n", ok);
}
return 0;
}