长理 校赛的 一个贪心题

cls与lzp的热身赛

发布时间: 2017年12月11日 13:58   最后更新: 2017年12月11日 14:46   时间限制: 1000ms   内存限制: 128M

描述

众所周知,长春理工大学的“嗨呀好气啊”队伍由两个菜鸡lzp和cls以及某X姓巨巨组成,热身赛打的太好可能导致电脑里的PC^2被删掉,所以热身赛一般都是由lzp和cls两个菜鸡代表队伍参加比赛,热身赛由n道题组成,他们队内分工明确,lzp想出思路,然后cls去写,第i个题目lzp思考出来的是第ai分钟,cls需要bi分钟来写(显然需要lzp想出思路cls才能去写这个题目),由于cls比较优秀,cls可以在写一道题的中途换写另一道题(cls写正在写A题时,可以跳去写B题,然后再回来写A题,也可以去写C题),设第i道题在第ci分钟写完,那么最后得到的罚时就是Σci(ci的和)。

lzp和cls当然希望他们的罚时最少(即Σci最小),快来帮帮他们吧!

输入

多组输入,每组第一行输入一个数n(0<n<100000),
接下来的n行每行输入两个数ai和bi,分别表示第i个题lzp需要思考的时间和cls需要写的时间(0<ai,bi<100)。

输出

每组输出一个数x,表示lzp和cls解决n道题的最少罚时。

样例输入1

3
1 5
2 1
3 7

2
1 7
3 6

样例输出1

24

22

题目分析 : 题意还是很好理解的,很明确,想一想会发现,就是你不管怎么去换题目,你敲完最后一道题目的时间是确定的,那么就课以想到一个贪心策略,尽可能早的完成题目,以减少罚时,这里可以用优先队列去维护,当在a[i]时间的时候,你可以操作的时间就是到a[i+1],在这个时间内,你要去完成这段时间可以完成的题目。自己理会一下吧!

代码示例 :  注意是 long long  
struct node
{
    ll a, b;

    bool operator< (const node &c)const{
        return a < c.a;
    }
}pre[eps];

priority_queue<ll, vector<ll>, greater<ll> >que;

int main() {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    int n;

    while(~scanf("%d", &n)){
        for(int i = 1; i <= n; i++){
            scanf("%lld%lld", &pre[i].a, &pre[i].b);
        }
        sort(pre+1, pre+1+n);
        ll ans = 0;
        ll t;
        for(int i = 1; i <= n; i++){
            t = pre[i].a;
            ll u = pre[i].b;
            que.push(u);

            if (i < n){
                while(!que.empty()){
                    if (t >= pre[i+1].a) break;

                    u = que.top();
                    que.pop();

                    if (t + u <= pre[i+1].a){
                        t += u;
                        ans += t;
                    }
                    else {
                        u -= pre[i+1].a - pre[i].a;
                        t = pre[i+1].a;
                        que.push(u);
                    }
                }
            }
        }
        while(!que.empty()){
            ll u = que.top();
            que.pop();
            t += u;
            ans += t;
        }
        printf("%lld\n", ans);
    }

    return 0;
}
时间: 2024-11-05 21:45:57

长理 校赛的 一个贪心题的相关文章

[BNUZOJ1261][ACM][2016北理校赛]方块消除(栈,字符串)

玩过方块消除游戏吗?现在规定当有两个或两个以上相邻且颜色相同的方块在一起的时候,它们就会产生消除反应.当存在多个消除反应同时产生时,最下的反应先执行.现在只给你其中一列,求最后剩下的方块结果. 输入要求 第一行是一个整数T(T<=100),表示有T组测试数据.每组测试数据一行.每行有一串数字(数字长度<=1,000,000),按从下往上给出一列方块的颜色(颜色用0-9表示,每个数字代表一种颜色).(数字长度大于100,000的不超过5组) 输出要求 输出消除后的结果. 测试数据示例 输入 21

校赛-最可惜的一题

Description Input Output 当时做题时,思路没问题,但是有一个很大的问题就是自己在编程时没化简表达式,n*m 爆了 int,还有一个点就是,向上去整没用好! #include <bits/stdc++.h> using namespace std; int main() { double n,m,k; cin >> n >> m >> k; int res = 0; if(n*m == k){ res = 0; cout <<

[第十届校赛]简单总结

这次校赛其实是抱着比较大的期望来打的,首先我是单挑,好像自从去年蓝桥杯后就没有一个人做过比赛,一般都是组队做,这次单挑,是想测测自己的水平和对节奏的把握,也有夺冠的冲动,很可惜,整体上是失败了TAT.如果一开始就稳扎稳打,说不定真的可以题数碾压.. 做完胡老师出的三个水题后,交了一发卡精度的二分,节奏就开始乱了.首先我自认为我的思路很正确,并且已经将误差降到很低了,但陆陆续续wa了7发,wa的原因自然是精度问题.大概比赛结束前2个小时,我把精度加大了一位,居然奇迹般的过了,无语..我一直以为比目

第九届西电ACM校赛解答

Description 欢迎参加西电第九届ACM校内赛!作为一名经历了四届校赛的ACM老队员以及本次校赛的出题人,每次校赛都让我有一种全新的感受--有第一次参加校赛时提交代码时紧张到双手发抖,也有当裁判时看到有些不明真相的人提交编译后程序时的欢乐.不管你是第几次参赛,好好享受这一刻带给你的各种感受,经历就是一种财富.为了让大家更好地记住这悲喜交加的日子,特意准备了这么一道题: 给你一个日期,你只要输出这个日期是在校赛前还是校赛后,或者刚好就是校赛那一天(2011年5月22号). 题目是什么意思呢

2018bnu校赛总结

····我好菜,完全没有准确率只写了签到,完全被吊打QAQ 大概就是自己懒惰的后果吧qwq A 塞特斯玛斯塔 签到···我因为是多组样例wa了一发···· #include <bits/stdc++.h> using namespace std; char s[100010]; int main() { int t,n;scanf("%d",&t); while(t--){ scanf("%d",&n); int cnt=0; for(i

CSU 1425 NUDT校赛 I题 Prime Summation

这个题本来有希望在比赛里面出了的 当时也想着用递推 因为后面的数明显是由前面的推过来的 但是在计算的时候 因为判重的问题 ...很无语.我打算用一个tot[i]来存i的总种树,tot[i]+=tot[j]//j为可以由j推到i的一系列数,但这样是不对的,会产生大量重复计算... 看了下标程才发现要用二维来计算出种类总数,f[i][j]+=sum(f[i-j][k]) 表示在推i数的时候,第一个素数为j的种类数,注意j一定为素数,而且k不能大于j...标程里面处理的比较简练,就学了下他的写法. 至

ZJU校赛 一道计数题

题意是这样的 给定一个n*m的整数矩阵 n和m均小于1000 对这个矩阵删去任意行和列后剩余一个矩阵为M{x1,x2,,,,xm;y1,y2,,,,,yn}表示删除任意的M行N列 对于这个剩下的矩阵,我们考虑其中是否存在特殊的元素,保证这些元素是所在行最大,所在列最小的元素 且非之一. 求对于所有删法,上述元素个数之和 对10^9+7取余. 显然所有删法 有2^(n+m)种 暴力是搞不定的. 于是反过来看,矩阵的元素最多有10^6个 是不是可以考虑每一个元素对最终答案的贡献? 所谓贡献,就是它在

【杂题总汇】HDU多校赛第十场 Videos

[HDU2018多校赛第十场]Videos 最后一场比赛也结束了-- +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和看了这部电影会得到的快乐值.电影分成两种类型,若同一个人连续(不是时间连续,是顺序连续)看了两部相同类型的电影,他的快乐值会扣除W,数据保证扣除的值不超过电影增加的快乐值. 特别的,一个人换电影不花费时间,即若第一部电影的结束时间等于下一部电影的开始时间,是可以两场都看的:看电影必须看完:一部电影只能一个人看

西电校赛网络赛J题 lucas定理计算组合数

西电校赛网络赛J题  lucas定理计算组合数 问题 J: 找规律II 时间限制: 1 Sec  内存限制: 128 MB 提交: 96  解决: 16 [提交][状态][讨论版] 题目描述 现有数阵如下: 1    2  3   4     5    6 1   3   6  10  15 1   4  10   20 1   5   15 1    6 1 求这个数阵的第n行m列是多少(行列标号从1开始) 结果对10007取模 输入 多组数据,每组数据一行,包含两个整数n,m(1<=n<=