您的位置:首页 > 编程语言 > C语言/C++

1015 Accepted 332K 32MS C++ 1740B

2011-08-08 22:13 162 查看
#include<stdio.h>

#include<string.h>

#include<stdlib.h>

int f[21][1000];

int path[21][1000];

int p[201];

int d[201];

int ans[21];

int cmp(const void * e1,const void *e2){

int *p1=(int *)e1;

int *p2=(int *)e2;

return *p1-*p2;

}

int main()

{

int n,m;

int i,j,k;

int t,u;

int nCount=0;

while(scanf("%d%d",&n,&m)){

if(n==0&&m==0) break;

nCount++;

for(i=0;i<n;i++)

scanf("%d%d",&p[i],&d[i]);

memset(path,0,sizeof(path));

memset(f,-1,sizeof(f));

int PM=20*m;

f[0][PM]=0; // 0个候选人使得辩控差为PM 也就是0,辩控和为0;

for(i=0;i<m;i++)

for(j=0;j<=2*PM;j++)

if(f[i][j]>=0){

for(k=0;k<n;k++){ //因此最好计数从1开始

if(f[i][j]+p[k]+d[k]>f[i+1][j+p[k]-d[k]]){

t=i;

u=j;

while(t>0&&path[t][u]!=k){

u-=(p[path[t][u]]-d[path[t][u]]);

t--;

}

if(t==0){

f[i+1][j+p[k]-d[k]]=f[i][j]+p[k]+d[k];

path[i+1][j+p[k]-d[k]]=k;

}

}

}

}

i=PM;

j=0;

while(f[m][i+j]<0&&f[m][i-j]<0)

j++;

if(f[m][i+j]>f[m][i-j])

k=i+j;

else

k=i-j;

printf("Jury #%d\n",nCount);

printf("Best jury has value %d for prosecution and value %d for defence:\n",(f[m][k]+k-PM)/2,(f[m][k]+PM-k)/2);

i=0;

while(m>0){

ans[i]=path[m][k];

k-=(p[path[m][k]]-d[path[m][k]]);

m--;

i++;

}

qsort(ans,i,sizeof(int),cmp);

for(j=0;j<i;j++)

printf(" %d",ans[j]+1); //计数比编号大一

printf("\n");

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: