国王的游戏

题目链接: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 } 

 

posted @ 2020-06-02 23:31  Maynerd  阅读(167)  评论(0编辑  收藏  举报