//大意理解 先排序 最早交的里面选最大值 扫描完了加没写的 排序后 应该是早交的和扣分多的在前 用结构体吧
/*#include<stdio.h>
#include<stdio.h>
int cmp(void const* a,void const*b)
{
if(*(st*)a->t==*(st*)b->t)
return *(st*)b->kou-*(st*)b->kou;
else
return *(st*)a->t-*(st*)b->t;
}
typedef struct
{
int vis;
int t;
int kou;
}st s[10000];
int main()
{
return 0;
}*/ //理解完全错误啊这样选择完全得不到解
题意就是最大的最迟做 做不了就被扣分。。 AC代码如下:
#include<stdio.h> #include<stdlib.h> #include<string.h> struct st { int time;; int score; }a[1001]; int cam(const void *x,const void *y) { struct st p = *((struct st *)x); struct st q = *((struct st *)y); return q.score-p.score; } int main() { int t; scanf("%d",&t); while(t--) { int n, vis[1001]; scanf("%d",&n); int i; for(i=1;i<=n;i++) { scanf("%d",&a[i].time); } for(i=1;i<=n;i++) { scanf("%d",&a[i].score); } for(i=1;i<=n;i++) //printf("%d %d ",a[i].time,a[i].score); qsort(&a[1],n,sizeof(a[1]),cam); int count = 0; int day=0; int j; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { for(j=a[i].time;j>=1;j--) { if(!vis[j]) { vis[j]=1; break; } } if(j<=0) count+=a[i].score; } printf("%d ",count); } return 0; }
感觉和网上搜的如出一辙。。。
#include<stdio.h> #include<stdlib.h> typedef struct { //int vis; int t; int kou; }st; st s[10000]; int vis[100000]; int cmp(void const* a,void const*b) { return ((st*)b)->kou-((st*)a)->kou; } int main() { int max_t,i,ci,c; scanf("%d",&ci); while(ci--){ int sum=0,j; scanf("%d",&c); max_t=-1; for(i=0;i<c;i++) { scanf("%d",&s[i].t); max_t=max_t>s[i].t?max_t:s[i].t; } for(i=1;i<=max_t;i++)vis[i]=0; for(i=0;i<c;i++) { scanf("%d",&s[i].kou); } qsort(s,c,sizeof(s[0]),cmp); for(i=0;i<c;i++) { for(j=s[i].t;j>0;j--) { if(!vis[j]) { vis[j]=!vis[j]; break; } } if(j==0) { sum+=s[i].kou; } } printf("%d ",sum); } return 0;