题目:
Football
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 257 测试通过 : 67
总提交 : 257 测试通过 : 67
题目描述
现在你是一名足球经理,你的队伍将参加“南邮杯”的比赛。然而你拥有预知未来的能力,你可以预见你的队伍接下来进行的n场比赛每场的进球数和失球数。每胜一场队伍可得3分,平一场可得1分,输一场得0分。然而“南邮杯”是有黑幕的,你通过砸钱现在可以买到m个进球,问现在如何安排这m个进球,可以使得队伍获得最大的积分,求出这个最大的积分。
输入
多样例输入。
第一行给出n(1<=n<=10)和m(0<=m<=20)分别代表你队伍进行的比赛数以及队伍可买的进球数。
接下来n行,每行分别有两个数x和y分别表示该场比赛在没有买进球的情况下你队伍的进球数和失球数。
输出
对于每个样例答案输出一行输出一个整数,表示通过买球的方式你的队伍可获得的最大积分。
样例输入
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;
}