本文共 2481 字,大约阅读时间需要 8 分钟。
相对简单一点的国王游戏:
对于两位大臣时的情况,设国王的左右手分别为a0,b0,第一位大臣的左右手分别为a1,a2,第二位大臣的左右手为a2,b2。 第一种排序情况(a0,b0),(a1,b1),(a2,b2)。这种情况下,第一位大臣的值为a0/b1,第二位大臣的值为(a0+a1)/b2,题目所要求的值为max(a0/b1,(a0a1)/b2) 第二种排序情况为(a0,b0),(a2,b2),(a1,b1)。这种情况下求得所需的值为max(a0/b2,(a0a2)/b1) 如果我们按第一种方式排序则需要满足的条件为max(a0/b1,(a0a1)/b2)<=max(a0/b2,(a0a2)/b1) 其中a0/b1<(a0a2)/b1,a0/b2<(a0a1)/b2,所以要满足这种排序,必须要求(a0a1)/b2<(a0a2)/b1,化简得a1b1<a2b2,我们要按照这个顺序排好序,然后计算出最大值,在计算最大值时要解决高精度的问题,代码如下:#includeusing namespace std;int n;int ans[20005],res[20005];struct hand{ int z,y;}o[10007];bool cmp(hand a,hand b){ return a.z*a.y =10) { res[i+1]+=res[i]/10; res[i]%=10; } } string s3=""; bool book=0; for(i=s1.size()+s2.size()-1;i>=0;i--) { if(res[i]==0&&!book) continue; else{ book=1; s3+=res[i]+'0'; } } return s3;}string chu(string s1,int c){ int i,book=0; for(i=0;i s2.size()?s1:s2; else return s1>s2?s1:s2;}int main(){ int i; scanf("%d",&n); for(i=0;i<=n;i++) scanf("%d%d",&o[i].z,&o[i].y); sort(o+1,o+1+n,cmp); string as="0",fz=getstring(o[0].z); for(int i=1;i<=n;i++) { as=mx(as,chu(fz,o[i].y)); fz=cheng(fz,getstring(o[i].z)); //cout< <
稍微复杂一些的皇后游戏:
这个题并没有皇后的参与,我们考虑两个大臣的情况,设两位大臣的左右手分别为(a1,b1),(a2,b2),两个大臣之前的大臣的值为s,两位大臣之前所有大臣的左手和为c。 我们按照(a1,b1)和(a2,b2)这个顺序排序时,最大值为max(max(s,c+a1)+b1,c+a1+a2)+b2 我们按照(a2,b2)和(a1,b1)这个顺序排序时,最大值为max(max(s,c+a2)+b2,c+a2+a1)+b1 要使第一种顺序是我们所需要的,必须满足的条件为 max(s+b1+b2,c+a1+b1+b2,c+a1+a2+b2)<max(s+b2+b1,c+a2+b2+b1,c+a2+a1+b1) 因为第一项相同,可以直接约去 max(c+a1+b1+b2,c+a1+a2+b2)<max(c+a2+b2+b1,c+a2+a1+b1) 同时减去c后得 max(a1+b1+b2,a1+a2+b2)<max(a2+b2+b1,a2+a1+b1) 再化简为 max(b1,a2)+a1+b2<max(b2,a1)+a2+b1 移项后为: max(b1,a2)-(a2+b1)<max(b2,a1)-(a1+b2) 左边实际就是用去掉a2,b1中较大的,然后剩下较小的去负,右遍一样 则化简为-min(b1,a2)<-min(b2,a1)即min(b1,a2)>min(b2,a1) 我们排序时,只需要考虑这些问题: 要使左手小的情况下右手尽量大,这样才可能排前面 对于左手小于右手的大臣,我们只需要按照左手从小到大排序 对于右手大于左手的大臣,我们只需按照右手从大到小排序 对于这两种不同情况的大臣,我们只需要将左手小于右手的放前面就可以。 对于左右手相等的大臣,怎么排都可以代码如下:
#includeusing namespace std;int T,n;long long ans[20007];struct node{ int l,r,flag;}a[20007];bool cmp(node x,node y){ if(x.flag!=y.flag) return x.flag y.r;}int main(){ scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&a[i].l,&a[i].r); if(a[i].l>a[i].r) a[i].flag=1; else if(a[i].l
转载地址:http://xsgwi.baihongyu.com/