博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2123皇后游戏+P1080国王游戏
阅读量:3952 次
发布时间:2019-05-24

本文共 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,(a0
a2)/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,我们要按照这个顺序排好序,然后计算出最大值,在计算最大值时要解决高精度的问题,代码如下:

#include
using 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)
我们排序时,只需要考虑这些问题:
要使左手小的情况下右手尽量大,这样才可能排前面
对于左手小于右手的大臣,我们只需要按照左手从小到大排序
对于右手大于左手的大臣,我们只需按照右手从大到小排序
对于这两种不同情况的大臣,我们只需要将左手小于右手的放前面就可以。
对于左右手相等的大臣,怎么排都可以

代码如下:

#include
using 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/

你可能感兴趣的文章
简单明了《a标签的href》跳转页面情况,看完秒懂!!!
查看>>
Android系统目录结构
查看>>
Activity的生命周期及启动模式整理
查看>>
android的IPC机制思维导图
查看>>
Fragment中mAdded和mDetached标志位
查看>>
Android的View事件机制思维导图
查看>>
Spring中Bean的装配思维导图
查看>>
View的工作原理
查看>>
Window和WindowManager思维导图
查看>>
简单常见算法整理
查看>>
图论部分算法整理
查看>>
数学基本算法整理
查看>>
Android性能优化
查看>>
Android绘图机制及处理技巧
查看>>
Bitmap的加载和Cache
查看>>
ListView的使用
查看>>
Android动画机制总结
查看>>
NDK开发总结
查看>>
设计模式之创建型模式
查看>>
设计模式之结构型模式
查看>>