NOJ J题 FootBall

题目:

Football

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

题目描述

现在你是一名足球经理,你的队伍将参加“南邮杯”的比赛。然而你拥有预知未来的能力,你可以预见你的队伍接下来进行的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

题目来源

NUPT



题目分析:

               贪心。一次录入赢球数,输球数。然后先把平局补成赢局。然后根据(输球数-赢球数)对输球的比赛进行贪心。然后求结果即可。

以下代码能够AC,但我不知道是否正确理解了出题人的意思,以下代码仅供参考。


代码如下:

/*
 * d.cpp
 *
 *  Created on: 2015年3月29日
 *      Author: Administrator
 */

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int maxn = 15;


struct Ball {
	int win;
	int lose;
	int dis;
	double ratio;
} balls[maxn];

bool cmp(Ball a, Ball b) {
	return a.dis < b.dis;
}

bool cmp1(int a,int b){
	return a < b;
}

void printBalls(int n) {
	int i;
	for (i = 0; i < n; ++i) {
		printf("%d %d %d\n", balls[i].win, balls[i].lose, balls[i].dis);
	}
}
int main() {
	int n, m;
	while (scanf("%d%d", &n, &m) != EOF) {
		int i;
		for (i = 0; i < n; ++i) {
			scanf("%d%d", &balls[i].win, &balls[i].lose);
			balls[i].dis = balls[i].lose - balls[i].win;
		}


		int lose_p[maxn];
		int lost_cnt = 0;

		int win_or_p[maxn];
		int win_or_cnt = 0;

		for (i = 0; i < n; ++i) {
			if (m > 0) {
				if (balls[i].dis == 0) {
					balls[i].win++;
					m--;
					balls[i].dis = -1;
				}
			}
		}


		for (i = 0; i < n; ++i) {
			if (balls[i].dis > 0) {
				lose_p[lost_cnt++] = balls[i].dis;
			} else {
				win_or_p[win_or_cnt++] = balls[i].dis;
			}
		}


		sort(lose_p, lose_p + lost_cnt, cmp1);


		int ans = 0;

		for (i = 0; i < lost_cnt; ++i) {
			if (m > 0) {
				if (m > (lose_p[i] )) {
					m -= (lose_p[i] + 1);
					lose_p[i] = -1;
				} else if (m == (lose_p[i])) {
					m -= (lose_p[i]);
					lose_p[i] = 0;
				}
			}
		}


		for (i = 0; i < lost_cnt; ++i) {
			if (lose_p[i] < 0) {
				ans += 3;
			} else if (lose_p[i] == 0) {
				ans += 1;
			}
		}


		for(i = 0 ; i < win_or_cnt ; ++i){
			if(win_or_p[i] < 0){
				ans += 3;
			}else if(win_or_p[i] == 0){
				ans += 1;
			}
		}
//		printf("m:%d\n", m);
//		printf("%d\n", ans);
		cout << ans << endl;

	}

	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值