G - 机器人
首先我们把这些小机器人按默认顺序计算看看结果如何
假设只有四位数
拆开,得到
从该式子中我们可以发现 x 的大小对结果大小不影响,我们只需要关注 最后面的四个数即可找出来大小关系。
那么我们将第二项 和 第三项交换一下位置进行比较看看。
我们发现中间两项的大小发生了变化。
那么我们比较交换后的数和未交换的数的大小如何,显然只需要比较中间两项即可。
不妨令变换后大于原来的
经化简,若要使该式成立,那么我只需要令
即可。
那么我们只需要根据这个关键值将所有的顺序排好就可以得到结果的最大值。
因为 20! 会爆掉所以,高精度即可。
#include<iostream> #include<algorithm> #include<vector> using namespace std; struct node{ int a , b; double c; bool operator < (const node &K) const { return c > K.c; } }aa[25]; int s1[10000]; int s2[10000]; int s3[10000]; void chen1(int d1){ int c = 0; int tmp = 0; int k = 0; for(int i = 1 ; i <= s1[0] ; i++){ tmp = s1[i] * d1 + c; c = tmp / 10; s3[++k] = tmp % 10; } if(c!=0){ s3[++k] = c; } s1[0] = k; for(int i = 1 ; i <= k ; i ++){ s1[i] = s3[i]; } } void chen2(int d1){ int c = 0; int tmp = 0; int k = 0; for(int i = 1 ; i <= s2[0] ; i++){ tmp = s2[i] * d1 + c; c = tmp / 10; s3[++k] = tmp % 10; } if(c!=0){ s3[++k] = c; } s2[0] = k; for(int i = 1 ; i <= k ; i ++){ s2[i] = s3[i]; } } void jia(){ int size = 0; int tmp = 0; for(int i = 1 ; i <= s1[0] || i <= s2[0] ;i ++){ if(i > s1[0]) tmp += s2[i]; else if(i > s2[0]) tmp += s1[i]; else tmp += s1[i] + s2[i]; s3[++size] = tmp % 10; tmp /=10; } if(tmp != 0) s3[++size] = tmp; s1[0] = size; for(int i = 1 ; i <= size; i ++ ){ s1[i] = s3[i]; } } int main(){ int n , x; cin >> n >> x; for(int i = 0 ; i < n ; i ++){ cin >> aa[i].a >> aa[i].b; aa[i].c = (double)(aa[i].a - 1)/aa[i].b; } sort(aa,aa+n); s1[0] = 0; int tot = 0; while(x){ s1[0]++; s1[++tot] = x % 10; x/=10; } for(int i = 0 ; i < n ; i ++){ chen1(aa[i].a); } for(int i = n - 1 ; i >= 0 ; i --){ s2[0] = 0; tot = 0; x = aa[i].b; while(x){ s2[0]++; s2[++tot] = x % 10; x/=10; } for(int j = 0 ; j < i ; j ++ ){ chen2(aa[j].a); } jia(); } for(int i = 1 ; i <= s1[0] ; i ++ ){ printf("%d",s1[s1[0] - i + 1]); } cout << endl; }