C++ 分治思想 真假银币

 1 #include "stdio.h"
 2 #include "iostream"
 3 #define MAXNUM 30
 4 
 5 int FalseCoin(int coin[], int low, int heigh)
 6 {
 7 int i, sum1, sum2, sum3;
 8 int re;
 9 
10 sum1 = sum2 = sum3 = 0;
11 if (low + 1 == heigh)
12 {
13 if (coin[low] < coin[heigh])
14 {
15 re = low + 1;
16 return re;
17 }
18 else
19 {
20 re = heigh + 1;
21 return re;
22 }
23 }
24 if ((heigh - low + 1) % 2 == 0) //n是偶数
25 {
26 for (i = low; i < low+(heigh - low) / 2; i++)
27 {
28 sum1 = sum1 + coin[i];
29 }
30 for (i = low + (heigh - low) / 2 + 1; i < heigh; i++)
31 {
32 sum2 = sum2 + coin[i];
33 }
34 if (sum1 > sum2)
35 {
36 re = FalseCoin(coin, low + (heigh - low) / 2 + 1, heigh);
37 return re;
38 }
39 else
40 {
41 }
42 }
43 else
44 {
45 for (i = low; i < low+(heigh - low) / 2 - 1; i++)
46 {
47 sum1 = sum1 + coin[i];
48 }
49 for (i = low + (heigh - low) / 2 + 1; i < heigh; i++)
50 {
51 sum2 = sum2 + coin[i];
52 }
53 sum3 = coin[low + (heigh - low) / 2];
54 if (sum1 > sum2)
55 {
56 re = FalseCoin(coin, low + (heigh - low) / 2 + 1, heigh);
57 return re;
58 }
59 else if (sum1 < sum2)
60 {
61 re = FalseCoin(coin, low, low + (heigh - low) / 2 - 1);
62 return re;
63 }
64 else
65 {
66 }
67 if (sum1 + sum3 == sum2 + sum3)
68 {
69 re = low + (heigh - low) / 2 + 1;
70 return re;
71 }
72 }
73 }
74 
75 int main()
76 {
77 int coin[MAXNUM];
78 int i, n;
79 int weizhi;
80 scanf("%d",&n);
81 for (i = 0; i < n; i++)
82 {
83 scanf("%d",coin[i]);
84 }
85 weizhi = FalseCoin(coin, 0, n - 1);
86 printf("在上述%d个银币中,第 %d 个银币是假的!\n",n,weizhi);
87 system("pause");
88 return 0;
89 }

 

posted @ 2019-07-07 12:49  我们都是大好青年  阅读(316)  评论(0编辑  收藏  举报