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

NYOJ-757-期末考试

时间:2015-07-29 17:20:44      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:队列-栈

期末考试
时间限制:1000 ms | 内存限制:65535 KB
难度:2
描述
马上就要考试了,小T有许多作业要做,而且每个老师都给出来了作业要交的期限,如果在规定的期限内没
交作业就会扣期末成绩的分数,假设完成每门功课需要一天的时间,你能帮助小T扣除的分数最小吗?
输入
输入n,表示n门功课(n<2000),接下来n行,每行两个数a,b,分别表示交作业的最后期限,迟交扣除的分数。
(以文件结尾)
输出
输出扣除的最小分数。
样例输入
3
3 10
3 5
3 1
3
1 6
3 2
1 3
7
1 3
4 2
6 1
4 7
2 6
4 5
3 4样例输出
0
3
5

题目分析:此题的关键是要对数据先排一下序,怎么排问题就来了,
此问题是让尽可能的少扣分,那么就应该按时间来排了,时间短的要尽快做了,但是有可能时间短的分值很低,也不能为了做时间短的而把分值高的给放弃。所以要先按时间排序,时间相等的就按分值排序,都是从小到大排。
排完序就用队列来解决取舍问题,队首存的都是分值最高的科目,队里存的都是做过科目。


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct qu
{
    int t;
    int s;
}a[2001];
bool cmp(qu x,qu y)
{
    if(x.t!=y.t) return x.t<y.t;
    return x.s<y.s;
};
int main()
{
    int n;
    priority_queue<int,vector<int>,greater<int> >q;
    while(cin>>n)
    {   
       while(!q.empty())
            q.pop();
        int i;
        for(i=0;i<n;i++)
            cin>>a[i].t>>a[i].s; 
        sort(a,a+n,cmp);
        int cost=0;
        for(i=0;i<n;i++)
        {
            if(q.size()<a[i].t)
               q.push(a[i].s);
            else
            {
                if(q.top()<a[i].s)
                {
                    cost+=q.top();
                    q.pop();
                    q.push(a[i].s); 

                }
                else
                cost+=a[i].s;
            }
        }
        cout<<cost<<endl;
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

NYOJ-757-期末考试

标签:队列-栈

原文地址:http://blog.csdn.net/sxc1414749109/article/details/47129307

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