NOJ 2082 football

来源:互联网 发布:php获取本机ip 编辑:程序博客网 时间:2024/06/06 02:36

    大晚上刷一题水题,话不多说见题目:

Football

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 352            测试通过 : 101 

比赛描述

现在你是一名足球经理,你的队伍将参加“南邮杯”的比赛。然而你拥有预知未来的能力,你可以预见你的队伍接下来进行的n场比赛每场的进球数和失球数。每胜一场队伍可得3分,平一场可得1分,输一场得0分。然而“南邮杯”是有黑幕的,你通过砸钱现在可以买到m个进球,问现在如何安排这m个进球,可以使得队伍获得最大的积分,求出这个最大的积分。

输入

多样例输入。

第一行给出n(1<=n<=10)m(0<=m<=20)分别代表你队伍进行的比赛数以及队伍可买的进球数。

接下来n行,每行分别有两个数xy分别表示该场比赛在没有买进球的情况下你队伍的进球数和失球数。

输出

对于每个样例答案输出一行输出一个整数,表示通过买球的方式你的队伍可获得的最大积分。

样例输入

2 1
1 1
1 1
3 2
1 3
3 1
2 2
4 10
1 1
2 2
1 3
0 4

样例输出

4
6
12

    AC代码: 

#include<stdio.h>#include<algorithm>using namespace std;const int maxn=10000;struct ball       //该题的关键  构造进球数和输球数的差量{//使用m个球去将平局填成胜局 将败局填成平局或者胜局int x,y,x_y;} b[maxn];bool cmp(const ball a,const ball b){return  a.x_y>b.x_y;}int main(){int n,m;while(scanf("%d%d",&n,&m)==2){for(int i=0; i<n; i++){scanf("%d%d",&b[i].x,&b[i].y);b[i].x_y=b[i].x-b[i].y;       //生成差球数}sort(b,b+n,cmp); //贪心法应用  该题只需要将差量按从小到大排序即可  非常容易理解int res=0;for(int i=0; i<n; i++){if(b[i].x>b[i].y)continue ;while(b[i].x_y<=0&&m>0)  //填局  控制差球数为一即可  在m>0的情况下{m--;               //填b[i].x_y++;}}for(int i=0; i<n; i++)   //遍历最终的局势  生成结果{if(b[i].x_y>0)res+=3;else if(b[i].x_y==0)res++;else if(b[i].x_y<0) //当遇到败局即可退出break;}printf("%d\n",res);}}


         需要注意的是,尽量将分数和比赛结果分开计算,可以减少发生逻辑错误的可能性。

    这一题其实很水,只需要构思到差球数这一概念即可,然后根据差球数进行排序。中间细节可见代码注释,不赘述。

    勉强算得上使用了贪心法吧。

    深夜刷题,刷了道水题…………

    不管怎么样,即时是刷水题也是有收获的,有收获就值得将它记下来。

    特此记下,以备后日回顾。

0 0
原创粉丝点击