您的位置:首页 > 大数据 > 人工智能

HDU1789 Doing Homework again(贪心)

2016-04-21 18:52 429 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1789
题目大意:在给定的作业扣分和截止时间中找出最少的扣分。解题思路:由贪心原则,现将数据排序,即按照所扣分数最大->最小排序(如果分数相同则按照截止日期从小到大排序)(cmp()),接下来从1->n 然后按顺序,从截止日期开始往前找没有占用掉的时间。如果找不到了,则加到罚分里面
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>

#define maxn 10000+5
#define ull unsigned long long
#define ll long long
#define reP(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define cle(a) memset(a,0,sizeof(a))
#define mod 90001
#define PI 3.141592657

const ull inf = 1LL << 61;
const double eps=1e-5;

using namespace std;

bool cmp(int a,int b){
return a>b;
}
struct node
{
int time;
int score;
bool mark;
}nod[1005];
int day[1005];
bool cmp1(node a,node b)
{
if(a.score==b.score)return a.time<b.time;
return a.score>b.score;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t,n,ans;
cin>>t;
while(t--)
{
ans=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>nod[i].time;
///nod[i].mark=false;
}
for(int j=1;j<=n;j++)
{
cin>>nod[j].score;
}
sort(nod+1,nod+1+n,cmp1);
int j;
memset(day,0,sizeof(day));
for(int i=1;i<=n;i++)
{
for(j=nod[i].time;j>=1;j--)
{
if(!day[j]){day[j]=1;break;}
}
if(j==0)ans+=nod[i].score;
}
cout<<ans<<endl;
}
return 0;
}

测试数据:score  7 6 5 4 3 2 1                     time   4 2 4 3 1 4 6           ans  5 本来应该是用 DP 解了, 毕竟贪心只能解决局部最优,而 DP 解决的是全局最优,就像浩神说的一样,一切问题都可以转换为DP 但是 DP 实在是太弱了,这题数据比较小贪心两次循环就可以解决
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: