Codeforces Round #303 (Div. 2)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值