题意就是要让给出的数字去互相取余,看看能得到最小的数事多少。
那么就可以从小到大排序,每一次都贪心地把最小的数作为攻击者,去攻击其他的数字(也就是大的取余小的),然后再一次排序,循环这个过程,直到出现1或者数字只剩一个非0数。
代码如下
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 int a[(int)1e5 + 10]; 6 7 int main() { 8 int n; 9 scanf("%d", &n); 10 for (int i = 0; i < n; i++) { 11 scanf("%d", &a[i]); 12 } 13 int begin = 0; 14 while (true) { 15 sort(a + begin, a + n); 16 while (a[begin] == 0) begin++; 17 if (begin == n - 1) break; 18 for (int i = begin + 1; i < n; i++) { 19 a[i] %= a[begin]; 20 if (a[i] == 1) { 21 puts("1"); 22 return 0; 23 } 24 } 25 } 26 printf("%d\n", a[n-1]); 27 return 0; 28 }
Atcoder Beginner Contest 118 C-Monsters Battle Royale(贪心)
原文:https://www.cnblogs.com/Mrzdtz220/p/10391044.html