1)正难则反,考虑把空隙弄到最大,即找出前M-1个最大的空隙
2)数据输入时,虽然M最大为20,但保留空隙的数组要开大(针对sort而言)
3)有可能M>C,这时,要取C-1作为空隙选取的个数上界
/* ID:linyvxi1 PROB:barn1 LANG:C++ */ #include <stdio.h> #include <algorithm> #include <stdlib.h> using namespace std; int min(int a,int b) { return a<b?a:b; } bool cmp(int a,int b) { return a>b; } int main() { int M,S,C; int arr[205],arr_blank[205]; FILE* fin=fopen("barn1.in","r"); FILE* fout=fopen("barn1.out","w"); // scanf("%d%d%d",&M,&S,&C); fscanf(fin,"%d%d%d",&M,&S,&C); int i; for(i=0;i<C;i++){ fscanf(fin,"%d",&arr[i]); } sort(arr,arr+C); int j=0; for(i=1;i<C;i++){ arr_blank[j]=arr[i]-arr[i-1]-1; j++; } sort(arr_blank,arr_blank+C-1,cmp); //slect the min M-1th int sum=0; for(i=0;i<min(M-1,C-1);i++) sum+=arr_blank[i]; fprintf(fout,"%d\n",arr[C-1]-arr[0]+1-sum); //printf("%d\n",arr_blank[0]); // system("PAUSE"); //fprintf(fout,"%d\n",arr[C-1]-arr[0]-sum); }
Here are the test data inputs:
------- test 1 ---- 4 50 17 3 4 6 8 14 15 16 17 25 26 27 30 31 40 41 42 43 ------- test 2 ---- 2 10 4 2 4 6 8 ------- test 3 ---- 3 27 16 2 3 5 6 8 9 10 13 14 15 16 19 20 21 22 27 ------- test 4 ---- 1 200 8 101 105 102 106 103 107 104 99 ------- test 5 ---- 50 200 10 18 69 195 38 73 28 6 172 53 99 ------- test 6 ---- 50 30 6 30 25 20 15 10 5 ------- test 7 ---- 20 200 80 65 178 64 70 18 32 88 90 98 20 152 31 118 117 127 81 175 73 136 161 165 63 130 133 190 10 4 138 200 43 189 37 86 182 145 110 67 126 114 153 99 25 155 119 176 55 48 197 62 147 125 60 12 23 112 96 27 122 35 50 36 49 149 108 100 188 77 191 6 121 166 132 82 95 150 89 22 40 128 56 ------- test 8 ---- 4 200 100 72 180 46 198 196 131 165 112 52 133 187 93 57 35 128 65 127 130 12 49 88 155 122 193 101 164 98 143 54 149 38 84 45 139 79 16 102 20 14 150 188 33 176 135 29 80 19 74 11 114 95 185 137 59 32 189 66 67 191 91 77 134 18 10 7 200 8 13 55 24 142 184 17 6 109 105 43 181 85 94 151 160 115 25 116 111 37 104 144 97 90 141 120 119 152 182 123 172 40 23 ------- test 9 ---- 20 195 100 1 2 3 4 5 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 41 42 43 44 45 51 52 53 54 55 61 62 63 64 65 71 72 73 74 75 81 82 83 84 85 91 92 93 94 95 101 102 103 104 105 111 112 113 114 115 121 122 123 124 125 131 132 133 134 135 141 142 143 144 145 151 152 153 154 155 161 162 163 164 165 171 172 173 174 175 181 182 183 184 185 191 192 193 194 195 ------- test 10 ---- 1 200 2 1 200