Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1562103
  • 博文数量: 327
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 3556
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-05 21:28
个人简介

东黑布衣,流浪幽燕。 真诚善良,值得信赖。

文章分类

全部博文(327)

我的朋友

分类: BSD

2007-04-28 13:37:40



  1. // 20170426adv.cpp : Public Poll.
  2. #include "stdafx.h"
  3. #include <stdio.h>

  4. int a[9];//保存一种组合
  5. int b[9];//最初的组合
  6. int sum0;
  7. int sum1;
  8. int sum2;
  9. int weight[9];//保存权值
  10. int map[3][9];
  11. int conv[3][9];//统治一个town需要劝说的最少人数
  12. int count=0;
  13. int N;//town number
  14. int convsum=-1;
  15. int tmp;
  16. void calc_conv_num(void)//遍历所有Town,计算该Town
  17. {              //三个候选人分别获胜需要劝说的最小人数
  18.    int j;
  19.    for(j=0;j<N;j++)
  20.    {
  21.       if(map[0][j]>map[1][j] && map[0][j]>map[2][j])
  22.       {
  23.          conv[0][j]=0;

  24.          conv[1][j]=(map[0][j]+2-map[1][j])/2;
  25.          if((map[1][j]+conv[1][j]) < map[2][j])
  26.             conv[1][j]=map[2][j]-map[1][j]+1;

  27.          conv[2][j]=(map[0][j]+2-map[2][j])/2;
  28.          if((map[2][j]+conv[2][j]) < map[1][j])
  29.             conv[2][j]=map[1][j]-map[2][j]+1;

  30.          b[j]=0;
  31.       }
  32.       else if(map[1][j]>map[0][j] && map[1][j]>map[2][j])
  33.       {
  34.          conv[0][j]=(map[1][j]+2-map[0][j])/2;
  35.          if(map[0][j]+conv[0][j]<map[2][j])
  36.             conv[0][j]=map[2][j]-map[0][j];

  37.          conv[1][j]=0;

  38.          conv[2][j]=(map[1][j]+2-map[2][j])/2;
  39.          if(map[2][j]+conv[2][j] < map[0][j])
  40.             conv[2][j]=map[0][j]-map[2][j]+1;

  41.          b[j]=1;
  42.       }
  43.       else
  44.       {
  45.          conv[0][j]=(map[2][j]+2-map[0][j])/2;
  46.          if(map[0][j]+conv[0][j] < map[1][j])
  47.             conv[0][j]=map[1][j]-map[0][j]+1;

  48.          conv[1][j]=(map[2][j]+2-map[1][j])/2;
  49.          if(map[1][j]+conv[1][j] < map[0][j])
  50.             conv[1][j]=map[0][j]-map[1][j]+1;

  51.          conv[2][j]=0;
  52.          b[j]=2;
  53.       }
  54.    }
  55. }

  56. void combination(int step)
  57. {
  58.    int i,j;
  59.    if(step==N)
  60.    {
  61.       sum0=0;
  62.       sum1=0;
  63.       sum2=0;
  64.       tmp=0;
  65.       for(i=0;i<N;i++){//针对一种组合,分别计算每一个候选人的票数
  66.          if(a[i]==0)
  67.             sum0+=weight[i];
  68.          else if(a[i]==1)
  69.             sum1+=weight[i];
  70.          else
  71.             sum2+=weight[i];
  72.       }
  73.       if(sum2>sum0 && sum2>sum1)//当这种组合shark获胜
  74.       {
  75.          for(j=0;j<N;j++)
  76.          {
  77.             if(a[j]!=b[j])//如果和最初组合b不同,则需要劝说
  78.             {
  79.                tmp+=conv[a[j]][j];//累加需要劝说的人数
  80.             }
  81.          }
  82.          if(convsum==-1)//第一次赋值
  83.             convsum=tmp;
  84.          else if(convsum>tmp)//tmp小于历史值,则更新历史值
  85.             convsum=tmp;
  86.       }
  87.       return;
  88.    }
  89.    a[step]=0;//深度递归
  90.    combination(step+1);
  91.    a[step]=1;
  92.    combination(step+1);
  93.    a[step]=2;
  94.    combination(step+1);
  95.    return;
  96. }

  97. int _tmain(int argc, _TCHAR* argv[])
  98. {
  99.    int i,j;
  100.    int t,test_case;
  101.    freopen("20170426in.txt","r",stdin);
  102.    scanf("%d",&test_case);
  103.    for(t=1;t<=test_case;t++)
  104.    {
  105.       for(j=0;j<9;j++)
  106.       {
  107.          a[j]=-1;
  108.          b[j]=-1;
  109.          weight[j]=-1;
  110.          for(i=0;i<3;i++)
  111.          {
  112.             map[i][j]=-1;
  113.             conv[i][j]=-1;
  114.          }
  115.       }
  116.       scanf("%d",&N);
  117.       for(j=0;j<N;j++)
  118.          scanf("%d",&weight[j]);
  119.       for(i=0;i<3;i++)
  120.          for(j=0;j<N;j++)
  121.             scanf("%d",&map[i][j]);

  122.       calc_conv_num();
  123.       convsum=-1;
  124.       combination(0);
  125.       printf("#%d %d\n",t,convsum);
  126.    }
  127.    return 0;
  128. }

  129. /* in
  130. 5
  131. 7
  132. 55 80 5 35 80 70 80
  133. 65 60 75 80 50 50 80
  134. 60 80 70 95 95 95 45
  135. 25 50 35 45 10 15 35
  136. 5
  137. 75 20 35 10 40
  138. 90 95 90 50 40
  139. 95 70 95 45 55
  140. 35 60 20 35 10
  141. 9
  142. 30 65 25 40 85 45 75 45 60
  143. 80 70 15 70 20 40 45 55 55
  144. 40 85 95 40 95 35 65 65 60
  145. 30 40 10 20 15 15 10 50 20
  146. 7
  147. 29 5 5 30 15 5 34
  148. 50 60 95 90 35 75 85
  149. 55 90 45 80 30 95 15
  150. 40 10 15 10 25 35 10
  151. 9
  152. 381 524 194 944 172 406 204 970 525
  153. 333 643 366 800 717 281 647 739 332
  154. 804 953 579 972 493 693 680 969 747
  155. 71 537 169 248 63 181 380 437 315
  156. */

  157. /* out
  158. #1 47
  159. #2 59
  160. #3 73
  161. #4 23
  162. #5 746
  163. */

阅读(2600) | 评论(5) | 转发(0) |
0

上一篇:04、形容词副词

下一篇:相信行动的力量

给主人留下些什么吧!~~

zhln2016-09-02 15:17:34

牛郎恋刘娘,刘娘念牛郎;牛郎牛年恋刘娘,刘娘年年念牛郎;郎恋娘来娘念郎,念娘恋郎,念郎恋娘。不绕死你,算我白忙!