hdu1789 簡單貪心演算法
題目大意
題目的意思 就是給出一個人接下來幾個任務的 最後期限和不完成這些任務所扣除的分數
讓你編寫程式碼 求出扣除最小的分數
可以用簡單的貪心演算法來做
先用結構體儲存並且自定義排序
排序的準則是 先按照扣除分數的大小排序 如果扣除分數大 那就放前面 如果扣除分數相同就把天數少的放前面
程式碼如下
#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;
}
程式碼的關鍵就是下面這個迴圈
{
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;