hdu 1789

来源:互联网 发布:指纹打卡机怎么导出数据 编辑:程序博客网 时间:2024/06/06 01:07

对于可以补的subject 应该优先考虑分数大的 并且尽量延后时间,只需要按照分值大小排序然后依次安排即可


#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<vector>#include<string>#include<cmath>#include<deque>#include<map>#include<queue>#define iinf 0x7f7f7f7f#define linf 1000000000000000000LL#define dinf 1e200#define eps 1e-11#define lng long long#define sqr(a) ((a)*(a))#define pii pair<int,int>#define X first#define Y second#define pi 3.14159265359#define cc(i,j) memset(i,j,sizeof(i))#define two(x)          ((lng)1<<(x))#define mod  9901#define pmod(x,y) (x%y+y)%y#include<set>using namespace std;typedef vector<int>  vi;typedef vector<string>  vs;template<class T> inline void checkmax(T &x,T y){if(x<y) x=y;}template<class T> inline void checkmin(T &x,T y){if(x>y) x=y;}template<class T> inline T Min(T x,T y){return (x>y?y:x);}template<class T> inline T Max(T x,T y){return (x<y?y:x);}template<class T> T Abs(T a){return a>0?a:(-a);}int ncase;int n,sum;pii d[1111];bool is[2222];bool cmp(pii p,pii q){    return p.X>q.X;}int main(){   scanf("%d",&ncase);   while(ncase--)   {       scanf("%d",&n);       sum=0;       for(int i=1;i<=n;++i)       scanf("%d",&d[i].Y);       for(int i=1;i<=n;++i)       {           scanf("%d",&d[i].X);       }       sort(d+1,d+1+n,cmp);       cc(is,0);       for(int i=1;i<=n;++i)       {           for(int j=d[i].Y;j>=0;--j)           {               if(j==0)               sum+=d[i].X;               else               if(!is[j])               {                   is[j]=1;                   break;               }           }       }       printf("%d\n",sum);   }    return 0;}