NOJ 2082 football

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

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


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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值