Codeforces Round #303 (Div. 2)

来源:互联网 发布:淘宝店铺不显示导航栏 编辑:程序博客网 时间:2024/06/01 20:28

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;}
0 0
原创粉丝点击