国王的游戏
题目链接:https://ac.nowcoder.com/login?callBack=%2Facm%2Fproblem%2F16561%3F%26headNav%3Dacm
题目意思: 国王要赏赐大臣,国王和每个大成左右手都有一个数字,然后他们排成一队,国王始终站在在前面,每个大臣得到的赏赐都是排在他前面的人(除他自己)的左手数字的累乘除以他本人右手上的数字。
题目思路:可以发现交换中间任意两个大臣的位置,都不会影响前面的大臣的赏赐,也不会影响后面的大臣的赏赐。所以我们假设A大臣在前面B大臣在后面优于他们的交换。那么通过列出计算式可以发现,A的左右手乘积小于B的左右手乘积。
具体看:https://ac.nowcoder.com/acm/problem/blogs/16561
1 #include <bits/stdc++.h> 2 using namespace std; 3 int now[20010],sum[20010],ans[20010],add[20010]; 4 struct Node { 5 int a; 6 int b; 7 long long a_b; 8 }node[1010]; 9 bool cmp (Node x,Node y){ 10 return x.a_b < y.a_b; 11 } 12 int read() { 13 int ans=0,flag=1; 14 char ch=getchar(); 15 while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar(); 16 if(ch=='-') flag=-1,ch=getchar(); 17 while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar(); 18 return ans*flag; 19 } 20 void times(int x){//½«x³ËÈëansÊý×飬addΪÖмäÊý×飬ģÄâ½øλ²ð·Ö 21 memset(add,0,sizeof(add)); 22 for(int i = 1;i <= ans[0];i ++){ 23 ans[i] *= x; 24 add[i + 1] = ans[i]/10; 25 ans[i] %= 10; 26 } 27 for(int i = 1;i <= ans[0] + 4;i ++){//½«½á¹û½øλ 28 ans[i] += add[i]; 29 if(ans[i] >= 10){ 30 ans[i + 1] += ans[i]/10; 31 ans[i] %= 10; 32 } 33 if(ans[i] != 0){ 34 ans[0] = max(ans[0],i);//ʵʱ¸üнá¹ûµÄ³¤¶È 35 } 36 } 37 } 38 void devide(int x){//½«ans³ýÒÔxµÄ½á¹û±£´æÔÚaddÖÐ 39 memset(add,0,sizeof(add)); 40 int q = 0; 41 for(int i = ans[0];i >= 1;i --){ 42 q *= 10; 43 q += ans[i]; 44 add[i] = q/x; 45 if(add[0] == 0 && add[i] != 0){ 46 add[0] = i; 47 } 48 q %= x; 49 } 50 } 51 bool compare(){ 52 if(add[0] == sum[0]){ 53 for(int i = add[0];i >= 1;i --){ 54 if(add[i] > sum[i]){ 55 return 1; 56 } 57 if(add[i] < sum[i]){ 58 return 0; 59 } 60 } 61 } 62 if(add[0] > sum[0]) return 1; 63 if(add[0] < sum[0]) return 0; 64 } 65 void cp(){ 66 memset(sum,0,sizeof(sum)); 67 for(int i = 0;i <= add[0];i ++){ 68 sum[i] = add[i]; 69 } 70 } 71 int main() { 72 int n,a,b; 73 n = read(); 74 for(int i = 0;i <= n;i ++){ 75 node[i].a = read();node[i].b = read(); 76 node[i].a_b = node[i].a * node[i].b; 77 } 78 sort(node + 1,node + n + 1,cmp); 79 ans[0] = 1;ans[1] = 1; 80 for(int i = 1;i <= n;i ++){ 81 times(node[i - 1].a);//ÀÛ³Ë×óÊÖÊý×Ö£¬´«ÈëÒ»¸ö³ËÒ»¸ö 82 devide(node[i].b);//³ýÒÔÓÒÊÖµÄÊý×Ö 83 if(compare()){//Èç¹û³ýÒÔÓÒÊÖµÄÊý×ֵĽá¹û(add)±Èsum£¨¾ÍÊÇ×îÖմ𰸣©Ð¡£¬¸üÐÂsum 84 cp();//¸´ÖƵ½sum 85 } 86 } 87 for(int i = sum[0];i >= 1;i --){ 88 cout<<sum[i]; 89 } 90 return 0; 91 }