您的位置:首页 > 其它

hdu1789 简单贪心算法

2016-11-26 23:11 155 查看
题目大意


题目的意思 就是给出一个人接下来几个任务的 最后期限和不完成这些任务所扣除的分数

让你编写代码 求出扣除最小的分数

可以用简单的贪心算法来做

先用结构体存储并且自定义排序

排序的准则是  先按照扣除分数的大小排序  如果扣除分数大 那就放前面 如果扣除分数相同就把天数少的放前面

代码如下

#include<iostream>

#include<cstring>

#include<string>

#include<algorithm>

using namespace std;

struct Nod

{

   int time,p;    

};

int f[1001];

Nod s[1001];

int cmp(Nod a,Nod b)

{

    if(a.p > b.p)

    return 1;

    else if(a.p == b.p &&a.time<b.time)

    return 1;

    else

    return 0;

}

int main()

{

    int t,n,i,j,a;

    scanf("%d",&t);

    while(t--)

    {

        memset(f,0,sizeof(f));

        scanf("%d",&n);

        for(i = 0;i < n;i++)

        {

            scanf("%d",&a);

            s[i].time = a;

        }

        for(i = 0;i < n;i++)

        {

            scanf("%d",&a);

            s[i].p = a;

        }

        int sum = 0;

        sort(s,s+n+1,cmp);

        for(i = 0;i < n;i++)

        {

            for(j = s[i].time; j > 0;j--)

            {

                if(!f[j])

                {

                    f[j] = 1;

                    break;

                }

            }

            if(j == 0)

            sum += s[i].p;

        }

        cout<<sum<<endl;

    }

    return 0;

}

代码的关键就是下面这个循环

  for(j = s[i].time; j > 0;j--)

            {

                if(!f[j])          //若f[j] = 1 表示这天已经被占据需要往前再找,如果没有为1则令f[j] = 1,表示这个任务在这天完成即可

                {

                    f[j] = 1;

                    break;

                }

            }

            if(j == 0)    //j=0 表示 已经没有时间完成这个任务所以只好不完成并且扣除分数;

            sum += s[i].p;

        }

        cout<<sum<<endl;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: