POJ 1015
来源:互联网 发布:网络电视接收机顶盒 编辑:程序博客网 时间:2024/05/16 09:14
题意:
在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n 个人作为陪审团的候选人,然后再从这n 个人中选m 人组成陪审团。选m 人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0 到20。为了公平起见,法官选出陪审团的原则是:选出的m 个人,必须满足辩方总分D和控方总分P的差的绝对值|D-P|最小。如果有多种选择方案的 |D-P| 值相同,那么选辩控双方总分之和D+P最大的方案即可。
输出:
选取符合条件的最优m个候选人后,要求输出这m个人的辩方总值D和控方总值P,并升序输出他们的编号。
思路:
动态规划,修正值那里还挺神奇的,最开始没写出来,参照了别人的代码(http://blog.csdn.net/lyy289065406/article/details/6671105)
具体思路见代码注释。
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<stack>#include<algorithm>#include<vector>#define y1 y12345#define mx 205#define inf 0x3f3f3f3f#define LL long long#define ULL unsigned long long#define mod 1000000007#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;struct point{ int d; //控方 int p; //辩方 int v; //d-p(控辩差) int s; //d+p}a[mx];int dp[25][805]; //dp[j][k]:取j个候选人,使其控辩差为k的所有方案中,控辩和最大的方案的控辩和int pre[25][8058]; //记录dp[j][k]的前驱int b[mx];bool haha(int j,int k,int id){ //判断dp[j][k]方案是否选取过候选人i while(j){ int i=pre[j][k]; if(i==id)return false; j--; k=k-a[i].v; } return true;}int main(){ int n,m; int ca=1; while(scanf("%d %d",&n,&m)&&n&&m){ for(int i=1;i<=n;i++){ scanf("%d %d",&a[i].p,&a[i].d); a[i].v=a[i].d-a[i].p; a[i].s=a[i].d+a[i].p; } const int fix=20*m; //总修正值,修正极限为从[-400,400]映射到[0,800] memset(dp,-1,sizeof(dp)); //dp值为-1代表dp[k][k]方案不合法 memset(pre,0,sizeof(pre)); dp[0][fix]=0; //dp[0][fix]为真正的dp[0][0] //dp for(int j=1;j<=m;j++){ for(int k=0;k<=2*fix;k++){ if(dp[j-1][k]!=-1){ for(int i=1;i<=n;i++){ if(haha(j-1,k,i)){ if(dp[j][k+a[i].v]<dp[j-1][k]+a[i].s){ dp[j][k+a[i].v]=dp[j-1][k]+a[i].s; pre[j][k+a[i].v]=i; } } } } } } //从中间向两边搜索寻找最小的控辩差 int ans=-1,ans1=-1,ans2=-1; for(int k=0;k<=fix;k++){ if(dp[m][fix-k]!=-1)ans1=fix-k; if(dp[m][fix+k]!=-1)ans2=fix+k; if(ans1!=-1&&ans2!=-1){ if(dp[m][ans1]>dp[m][ans2])ans=ans1; else ans=ans2; break; } else if(ans1!=-1){ans=ans1;break;} else if(ans2!=-1){ans=ans2;break;} } //b[i]记录路径 ans1=ans2=0; for(int i=m;i>0;i--){ b[i]=pre[i][ans]; ans1+=a[b[i]].p; ans2+=a[b[i]].d; ans=ans-a[b[i]].v; } sort(b+1,b+1+m); //输出 printf("Jury #%d\nBest jury has value %d for prosecution and value %d for defence:\n",ca++,ans1,ans2); for(int i=1;i<=m;i++)printf(" %d",b[i]); cout<<endl<<endl; } return 0;}
0 0
- POJ 1015
- POJ-1015
- POJ 1015
- POJ 1015
- POJ 1015
- Poj 1015
- poj-1015
- poj 1015
- POJ 1015
- POJ 1015
- POJ 1015
- POJ 1015
- poj 1015
- POJ 1015题意
- POJ 1015 Jury Compromise
- poj 1015 Jury Compromise
- [poj]动态规划1015
- POJ 1015 Jury Compromise
- FTP+SpringMVC+Uploadify实现带进度条多文件上传
- java集合笔记
- 强叔侃墙 VPN篇 IPSec兼容并济吸纳百家,GRE和L2TP改头换面深藏不漏
- 民生电商某缺陷导致可以随便认证刷钱
- RandomAccessFile-文件分割和组装
- POJ 1015
- imageloader加载网络图片
- IDEA远程debug调试
- Spring定时任务的几种实现
- wordpress子主题
- ns2.35嵌入gpsr协议
- 强叔侃墙 VPN篇 对等体检测洞察先机,双链路备份有备无患
- 为什么我们需要MVC?
- 关于LCD Flicker微调