poj 1015

http://poj.org/problem?id=1015

题意:n 个人作为陪审团的候选人,然后再从这n 个人中选m 人组成陪审团,选出的m 个人,必须满足辩方总分D控方总分P的差的绝对值|D-P|最小。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4
 5 int m,n;
 6 int dp[30][805];
 7 int d[300],p[300];
 8 int path[1000][1000];
 9 int ans[30];
10
11 int cmp(const void *a,const void *b)
12 {
13     return *(int *)a-*(int *)b;
14 }
15
16 int main()
17 {
18     int cnt = 1;
19     while(scanf("%d%d",&n,&m),m||n)
20     {
21         for(int i = 1;i<=n;i++)
22             scanf("%d%d",&d[i],&p[i]);
23
24         int Move = m*20;
25         memset(dp,-1,sizeof(dp));
26         memset(path,0,sizeof(path));
27
28         dp[0][Move] = 0;
29         /**
30         DP的部分
31         dp[i][j] 代表i个候选人,相差为j的分数且和最大的那个方案
32         **/
33         for(int i = 0;i<m;i++)
34             for(int j = 0;j<=Move*2;j++)
35                 if(dp[i][j]>=0)
36                 {
37                     for(int k = 1;k<=n;k++)
38                     {
39                         if(dp[i][j]+p[k]+d[k]>dp[i+1][j+d[k]-p[k]])
40                         {
41                             int t1 = i,t2 = j;
42                             //判断是否k这个人用过了
43                             while(t1>0&&path[t1][t2]!=k)
44                             {
45                                 t2-=d[path[t1][t2]]-p[path[t1][t2]];
46                                 t1--;
47                             }
48                             if(t1==0)
49                             {
50                                 dp[i+1][j+d[k]-p[k]] = dp[i][j]+p[k]+d[k];
51                                 path[i+1][j+d[k]-p[k]] = k;
52                             }
53                         }
54                     }
55                 }
56         int tmp = Move,tmp1 = 0;
57         while(dp[m][tmp+tmp1]<0&&dp[m][tmp-tmp1]<0)  //找出那个第一个不为-1的,则说明是相差值最小的
58             tmp1++;
59         //用来找那个最小的差
60         if(dp[m][tmp+tmp1]>dp[m][tmp-tmp1])
61             tmp = tmp+tmp1;
62         else tmp = tmp-tmp1;
63          printf("Jury #%d\n",cnt++);
64         printf("Best jury has value %d for prosecution and value %d for defence:\n",(tmp-Move+dp[m][tmp])/2,(dp[m][tmp]-tmp+Move)/2);
65          for(int i=1;i<=m;i++)
66         {
67             ans[i]=path[m-i+1][tmp];
68             tmp-=d[ans[i]]-p[ans[i]];
69         }
70         qsort(ans+1,m,sizeof(int),cmp);
71         for(int i=1;i<=m;i++)
72           printf(" %d",ans[i]);
73         printf("\n\n");
74     }
75     return 0;
76 }
时间: 2024-10-13 11:30:10

poj 1015的相关文章

POJ 1015 -- 陪审团人选

陪审团人选 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29543   Accepted: 7849   Special Judge 试题描述 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0到20.为了公平起见,法官选出陪审团的原则是

[dp] poj 1015 Jury Compromise

题目链接: http://poj.org/problem?id=1015 Jury Compromise Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24438   Accepted: 6352   Special Judge Description In Frobnia, a far-away country, the verdicts in court trials are determined by a jury

K - Jury Compromise POJ 1015 (动态规划 --难)

K - Jury Compromise Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1015 Description In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of members of the ge

[kuangbin 基础dp][POJ 1015] Jury Compromise(dp)

[kuangbin 基础dp][POJ 1015] Jury Compromise 题目 In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of members of the general public. Every time a trial is set to begin, a jury has to be selected, which is do

POJ 1015 Jury Compromise 2个月后重做,其实这是背包题目

http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0到20.为了公平起见,法官选出陪审团的原则是:选出的m个人,必须满足辩方总分和控方总分的差的绝对值最小.如果有多种选择方案的辩方总分和控方总分的之差的绝对值相同,那么选辩控双方总分之和最大的方案

POJ 1015 Jury Compromise

链接:http://poj.org/problem?id=1015 参考:http://blog.csdn.net/lyy289065406/article/details/6671105 题意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n 个人作为陪审团的候选人,然后再从这n 个人中选m 人组成陪审团.选m 人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0 到20.为了公平起见,法官选出陪审团的原则是:选出的m 个

Jury Compromise (POJ 1015) 难

http://poj.org/problem?id=1015 Description In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of members of the general public. Every time a trial is set to begin, a jury has to be selected, which is done

背包系列练习( hdu 2844 Coins &amp;&amp; hdu 2159 &amp;&amp; poj 1170 Shopping Offers &amp;&amp; hdu 3092 Least common multiple &amp;&amp; poj 1015 Jury Compromise)

作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢http://blog.csdn.net/eagle_or_snail/article/details/50987044,这里有大部分比较有趣的dp练手题. hdu 2844 Coins 多重背包 就是一个10w的多重背包,每个物品的cost同时也作为value去做背包,我们求的是每个容量下的价值,所以没

POJ 1015 / UVA 323 Jury Compromise(01背包,打印路径)

POJ1015?UVA323?参考文章 (博主看了几篇文章,但是都没有考虑到背包容量的越界问题,关于这个,会在代码里解释.顺便提一下,POj这题的数据是比较弱的,建议去UVA 323检测一下代码的正确性) 题目大意:给出$n$对数,从中选出$m$对数,使各对数的差累加和最小的情况下总和最大. ??设每对数的差值为$sub[i]$,和为$sum[i]$.要从中选出m个数,对于每个数来说,都有选与不选两种情况,所以能不能用背包来做呢?用背包的话还得确定容量.既然题目要求$sub$的总和最小的情况下$