满足 测试用例 提交 不通过-----------修改了冒号,变成部分正确 但还有超时,不知道哪个边界没处理好

  1 #include <cctype>//判断字符类型需要的头文件
  2 #include<iostream>
  3 #include <sstream>
  4 using namespace std;
  5 
  6 void Swap(long long  &a, long long &b)
  7 {
  8     long long  temp = a;
  9     a = b;
 10     b = temp;
 11 }
 12 void QuickSort(long long *arr, int start, int count)
 13 {
 14     if (count == 1)
 15     {
 16         return;
 17     }
 18     long long stand = arr[start];
 19     Swap(arr[count / 2], stand);
 20     for (int i = 0, j = count - 1; i < count / 2 && i < j; i++, j--)
 21     {
 22         while (arr[i] < stand&&i<count / 2 && i<j)
 23         {
 24             i++;
 25         }
 26         while (arr[j]>stand&&j>count / 2 && i < j)
 27         {
 28             j--;
 29         }
 30         Swap(arr[i], arr[j]);
 31     }
 32     QuickSort(arr, start, count / 2);
 33     QuickSort(arr, count / 2 + 1, count - count / 2);
 34 }
 35 void quick_sort(long long *s, int l, int r)
 36 {
 37     if (l < r)
 38     {
 39         //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1  
 40         int i = l, j = r, x = s[l];
 41         while (i < j)
 42         {
 43             while (i < j && s[j] >= x) // 从右向左找第一个小于x的数  
 44                 j--;
 45             if (i < j)
 46                 s[i++] = s[j];
 47 
 48             while (i < j && s[i] < x) // 从左向右找第一个大于等于x的数  
 49                 i++;
 50             if (i < j)
 51                 s[j--] = s[i];
 52         }
 53         s[i] = x;
 54         quick_sort(s, l, i - 1); // 递归调用   
 55         quick_sort(s, i + 1, r);
 56     }
 57 }
 58 bool IsPrime(int n)
 59 {
 60     if (n<2)
 61     {
 62         //小于2的数即不是合数也不是素数  
 63         return false;
 64     }
 65     for (unsigned i = 2; i<n / 2 + 1; ++i)
 66     {
 67         // 和比它的一半小数相除,如果都除不尽,证明素数  
 68         if (0 == n % i)
 69         {
 70             // 除尽了,合数  
 71             return false;
 72         }
 73     }
 74     return true; // 都没除尽,素数  
 75 }
 76 bool IsPrime2(int n)
 77 {
 78     if (n < 2)
 79     { // 小于2的数即不是合数也不是素数  
 80         return false;
 81     }
 82     static unsigned aPrimeList[] = { // 素数表  
 83         1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
 84         43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 113,
 85         193, 241, 257, 337, 353, 401, 433, 449, 577, 593, 641,
 86         673, 769, 881, 929, 977, 1009, 1153, 1201, 1217, 1249,
 87         1297, 1361, 1409, 1489, 1553, 1601, 1697, 1777, 1873,
 88         1889, 2017, 2081, 2113, 2129, 2161, 2273, 2417, 2593,
 89         2609, 2657, 2689, 2753, 2801, 2833, 2897, 3041, 3089,
 90         3121, 3137, 3169, 3217, 3313, 3329, 3361, 3457, 3617,
 91         3697, 3761, 3793, 3889, 4001, 4049, 4129, 4177, 4241,
 92         4273, 4289, 4337, 4481, 4513, 4561, 4657, 4673, 4721,
 93         4801, 4817, 4993, 5009, 5153, 5233, 5281, 5297, 5393,
 94         5441, 5521, 5569, 5857, 5953, 6113, 6257, 6337, 6353,
 95         6449, 6481, 6529, 6577, 6673, 6689, 6737, 6833, 6961,
 96         6977, 7057, 7121, 7297, 7393, 7457, 7489, 7537, 7649,
 97         7681, 7793, 7841, 7873, 7937, 8017, 8081, 8161, 8209,
 98         8273, 8353, 8369, 8513, 8609, 8641, 8689, 8737, 8753,
 99         8849, 8929, 9041, 9137, 9281, 9377, 9473, 9521, 9601,
100         9649, 9697, 9857
101     };
102 
103     const int nListNum = sizeof(aPrimeList) / sizeof(unsigned);//计算素数表里元素的个数  
104     for (unsigned i = 2; i<nListNum; ++i)
105     {
106         if (n / 2 + 1<aPrimeList[i])
107         {
108             return true;
109         }
110         if (0 == n%aPrimeList[i])
111         {
112             return false;
113         }
114     }
115     /*由于素数表中元素个数是有限的,那么对于用素数表判断不到的数,就只有用笨蛋办法了*/
116     for (unsigned i = aPrimeList[nListNum - 1]; i<n / 2 + 1; i++)
117     {
118         if (0 == n%i)
119         {
120             // 除尽了,合数   
121             return false;
122         }
123     }
124     return true;
125 }
126 
127 
128 
129 int main()
130 {
131     /*
132      1059. C语言竞赛(20)
133 
134 时间限制
135 200 ms
136 内存限制
137 65536 kB
138 代码长度限制
139 8000 B
140 判题程序
141 Standard
142 作者
143 CHEN, Yue
144 C语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:
145 
146 0. 冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。
147 1. 排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶!
148 2. 其他人将得到巧克力。
149 
150 给定比赛的最终排名以及一系列参赛者的ID,你要给出这些参赛者应该获得的奖品。
151 
152 输入格式:
153 
154 输入第一行给出一个正整数N(<=10000),是参赛者人数。随后N行给出最终排名,每行按排名顺序给出一位参赛者的ID(4位数字组成)。接下来给出一个正整数K以及K个需要查询的ID。
155 
156 输出格式:
157 
158 对每个要查询的ID,在一行中输出“ID: 奖品”,其中奖品或者是“Mystery Award”(神秘大奖)、或者是“Minion”(小黄人)、或者是“Chocolate”(巧克力)。如果所查ID根本不在排名里,打印“Are you kidding?”(耍我呢?)。如果该ID已经查过了(即奖品已经领过了),打印“ID: Checked”(不能多吃多占)。
159 
160 输入样例:
161 6
162 1111
163 6666
164 8888
165 1234
166 5555
167 0001
168 6
169 8888
170 0001
171 1111
172 2222
173 8888
174 2222
175 输出样例:
176 8888: Minion
177 0001: Chocolate
178 1111: Mystery Award
179 2222: Are you kidding?
180 8888: Checked
181 2222: Are you kidding?
182      */
183 
184     int count = 0;
185     cin >> count;//输入个数  
186 
187     string  members[10000];
188     for (size_t i = 0; i < count; i++)
189     {
190         cin >> members[i];//录入 ID   排名
191     }
192 
193     int countK = 0;//查询的个数
194     string membersK[10000];
195     string membersKvalue[10000];//对应的值
196     cin >> countK;
197     for (size_t i = 0; i < countK; i++)
198     {
199         cin >> membersK[i];//录入 查询ID   
200         int flag = 0;//标志位 判断是否 存在该id
201         int flag1 = 0;//标志位 判断是否 查询过
202         for (size_t j = 0; j < count; j++)
203         {
204             if (membersK[i] == members[j])
205             {
206                 flag = 1;
207                 if (j == 0)
208                 {
209                     membersKvalue[i] = "Mystery Award";
210                     break;
211                 }
212                 if (IsPrime2(j+1))
213                 {
214                     membersKvalue[i] = "Minion";
215                     break;
216                 }
217                 membersKvalue[i] = "Chocolate";
218                 break;
219             }
220         }
221         
222         for (size_t k = 0; k <i; k++)
223         {
224             if (membersK[k] == membersK[i])
225             {
226                 flag1 = 1;
227             }
228         }
229         if (flag1)
230         {
231             membersKvalue[i] = "Checked";
232         }
233         if (flag == 0)
234         {
235             membersKvalue[i] = "Are you kidding?";
236         }
237     }
238 
239     for (size_t i = 0; i < countK; i++)
240     {
241         cout << membersK[i] << ":" << membersKvalue[i] << endl;
242     }
243 
244 
245 
246 
247     return 0;
248 }

 

posted @ 2018-04-09 03:35  jieche  阅读(487)  评论(0编辑  收藏  举报