码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #303 (Div. 2)

时间:2015-05-20 11:22:38      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:codeforces   greedy   模拟   

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;
}

Codeforces Round #303 (Div. 2)

标签:codeforces   greedy   模拟   

原文地址:http://blog.csdn.net/u014357885/article/details/45867721

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!