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;
}
#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;
}
相关文章推荐
- Contest1015 - 2017年春季C++作业一 Problem A: 猜数游戏
- 【C++】PAT(basic level)1015. 德才论 (25)
- neuq oj 1015同因查找C++
- 1.Two Sum(c++)(附6ms O(n) accepted 思路和代码)
- hiho-1015(c++)
- pat 乙级 1015. 德才论 (25) c++
- 1015. 德才论 (25)(C++)
- C++一本通题库1015
- C++ - PAT - 1015. 德才论 (25)
- 1015C++中中文字符数组的关系
- 【C++】浙大PAT (Basic Level)1015. 德才论 (25)
- PAT乙级(C++)1011-1015
- More Effective C++之25
- C++初学笔记
- 【转译】Google C++ 编程风格指南【0】
- C/C++实现HTTP/HTTPS的POST存在的问题
- 拓扑多边形生成算法(C++源码)二 代码篇
- C/C++中函数指针的含义
- [转]关于C与C++中互相调用动态链接库的问题
- C++与C#中枚举类型的调用区别