大晚上刷一题水题,话不多说见题目:
Football
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 352 测试通过 : 101
总提交 : 352 测试通过 : 101
比赛描述
现在你是一名足球经理,你的队伍将参加“南邮杯”的比赛。然而你拥有预知未来的能力,你可以预见你的队伍接下来进行的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
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);
}
}
需要注意的是,尽量将分数和比赛结果分开计算,可以减少发生逻辑错误的可能性。
这一题其实很水,只需要构思到差球数这一概念即可,然后根据差球数进行排序。中间细节可见代码注释,不赘述。
勉强算得上使用了贪心法吧。
深夜刷题,刷了道水题…………
不管怎么样,即时是刷水题也是有收获的,有收获就值得将它记下来。
特此记下,以备后日回顾。