贪心入门题

Football

题目描述
现在你是一名足球经理,你的队伍将参加“南邮杯”的比赛。然而你拥有预知未来的能力,你可以预见你的队伍接下来进行的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之后看了学长的 代码,感觉学到了许多。学长用一个while循环来模拟,我的模拟方法则是不断地进行判断。
方法:把进球数与输球数的差保存在数组里,从大到小排序。大于零的不用考虑,小于等于零用while循环来模拟。

我的代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[11][2];
int dif[11];
bool com(int a, int b)
{
    return a>b;
}
void sum(int *, int );
int main()
{
    int n, m;
    while(scanf("%d%d", &n, &m)!=EOF)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d%d", &a[i][0], &a[i][1]);
            dif[i]=(a[i][0]-a[i][1]);
        }

        sort(dif, dif+n, com);
        if(m==0)
            sum(dif, n);
        else
        {
            for(int i=0; i<n&&m>=1; i++)
            {
                if(dif[i]>0)
                    continue;
                else if(dif[i]==0)//老错误了,赋值运算符与等于号
                {
                    dif[i]++;
                    m--;
                }
                else if(dif[i]<0)
                {
                    if(m==(-dif[i]))
                    {
                        dif[i]=0;
                        m=0;
                    }
                    else if(m<(-dif[i]))
                        break;
                    else
                    {
                        m=(m-(1-dif[i]));
                        dif[i]=1;
                    }
                }
            }
             sum(dif, n);
        }
    }

    return 0;
}
void sum(int *dif, int n)
{
    int s=0;
    for(int i=0; i<n; i++)
        if(dif[i]>0)
            s+=3;
        else if(dif[i]==0)
            s+=1;
        else
            continue;
    printf("%d\n", s);
    return;
}

学长的代码


#include <cstdio> 
#include <cstring> 
#include <algorithm> 
using namespace std;  
int n, m;  

struct Data  
{  
    int x, y;  
    int val;  
}d[100];  

bool cmp(Data a, Data b)  
{  
    return a.val > b.val;  
}  

int main()  
{  
    while(scanf("%d %d", &n, &m) != EOF)  
    {  
        for(int i = 0; i < n; i++)  
        {  
            scanf("%d %d", &d[i].x, &d[i].y);  
            d[i].val = d[i].x - d[i].y;  
        }  
        sort(d, d + n, cmp);  
        for(int i = 0; i < n; i++)  
        {  
            if(d[i].val > 0)  
                continue;  
            else   
            {  
                while(d[i].val <= 0 && m > 0)  
                {  
                    m --;  
                    d[i].val ++;  
                }  
            }  
            if(m == 0)  
                break;  
        }  
        int ans = 0;  
        for(int i = 0; i < n; i++)  
        {  
            if(d[i].val > 0)  
                ans += 3;  
            if(d[i].val == 0)  
                ans += 1;  
        }  
        printf("%d\n", ans);  
    }  
}

所以说多看看别人的源代码对于拓宽我们的思路是很有帮助的。

你可能感兴趣的:(贪心)