一道模拟刷题的题:
输出能够获得的最高的分值;如果有相同的,输出做题数量多的;如果还有相同的,输出罚时少的。
/* Problem : Status : By wf, */ #include "algorithm" #include "iostream" #include "cstring" #include "cstdio" #include "string" #include "stack" #include "cmath" #include "queue" #include "set" #include "map" #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 typedef long long ll; using namespace std; const int inf=0x3f3f3f3f; const int maxn=1e5+5; int alltime,n; struct P { int time,attr; }p[maxn]; bool cmp(P b, P c) { return b.time<c.time; } struct Node { int time; //提交时间 int attr; //总吸引力 int num; //解决的题目数量 int pena; //总罚时 }dp[maxn]; void print_arr(int a[],int n) { for(int i=0; i<n; ++i) { printf("%d ",a[i]); } printf(" "); } int main() { //freopen("in.txt","r",stdin); int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof dp); scanf("%d %d",&alltime,&n); for(int i=0; i<n; ++i) { scanf("%d",&p[i].time); } //sort(mytime,mytime+n); //print_arr(time,n); for(int i=0; i<n; ++i) { scanf("%d",&p[i].attr); } sort(p,p+n,cmp); // 不排序会错 for(int i=0;i<n;++i) { for(int v = alltime;v>=0;v--) { if( v<p[i].time )continue; if( dp[v].attr < dp[ v-p[i].time ].attr + p[i].attr ) { dp[v].attr = dp[ v-p[i].time ].attr + p[i].attr; dp[v].num = dp[ v-p[i].time ].num + 1; dp[v].time = dp[ v-p[i].time ].time + p[i].time; dp[v].pena = dp[ v-p[i].time ].pena + dp[v].time; } else if( dp[v].attr == dp[ v-p[i].time ].attr + p[i].attr ) { if( dp[v].num < dp[ v-p[i].time ].num +1 ) { dp[v].num = dp[ v-p[i].time ].num +1; dp[v].time = dp[ v-p[i].time ].time + p[i].time; dp[v].pena = dp[ v-p[i].time ].pena + dp[v].time; } else if( dp[v].num == dp[ v-p[i].time ].num +1 ) { if( dp[v].pena > dp[ v-p[i].time ].time + dp[ v-p[i].time ].pena ) { dp[v].time = dp[ v-p[i].time ].time + p[i].time; dp[v].pena = dp[ v-p[i].time ].pena + dp[v].time; } } } } } int ans = alltime; for(int i = alltime-1 ;i>=0;i--) { if( dp[ans].attr < dp[i].attr )ans = i; else if( dp[ans].attr == dp[i].attr ) { if( dp[ans].num < dp[i].num )ans = i; else if( dp[ans].num == dp[i].num ) { if( dp[ans].pena > dp[i].pena )ans=i; } } } printf("%d %d %d ",dp[ans].attr,dp[ans].num,dp[ans].pena); } return 0; }