相对简单一点的国王游戏:题目链接

对于两位大臣时的情况,设国王的左右手分别为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<bits/stdc++.h>
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<b.z*b.y;
}
string getstring(int num)
{string s="";while(num){s+=num%10+'0';num/=10;}reverse(s.begin(),s.end());return s;
}
string cheng(string s1,string s2)
{reverse(s1.begin(),s1.end());reverse(s2.begin(),s2.end());int i,j;memset(res,0,sizeof(res));for(i=0;i<s1.size();i++)for(j=0;j<s2.size();j++){res[i+j]+=(s1[i]-'0')*(s2[j]-'0');}for(i=0;i<s1.size()+s2.size();i++){if(res[i]>=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<s1.size();i++){ans[i]=(10*book+s1[i]-'0')/c;book=(book*10+s1[i]-'0')%c;}int len=0;while(len<s1.size()&&ans[len]==0) len++;string s3="";for(i=len;i<s1.size();i++)s3+=ans[i]+'0';return s3;
}
string mx(string s1,string s2)
{if(s1.size()!=s2.size())return s1.size()>s2.size()?s1:s2;elsereturn 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<<as<<endl;//cout<<fz<<endl;}cout<<as<<endl;return 0;
}

稍微复杂一些的皇后游戏:题目链接

这个题并没有皇后的参与,我们考虑两个大臣的情况,设两位大臣的左右手分别为(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<bits/stdc++.h>
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.flag;else if(x.flag<=0) return x.l<y.l;return x.r>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<a[i].r) a[i].flag=-1;else a[i].flag=0;}sort(a+1,a+1+n,cmp);//for(int i=1;i<=n;i++)//printf("l:%d r:%d\n",a[i].l,a[i].r);long long sum=0;for(int i=1;i<=n;i++){sum+=a[i].l;ans[i]=max(ans[i-1],sum)+a[i].r;}printf("%lld\n",ans[n]);}return 0;
}

P2123皇后游戏+P1080国王游戏相关推荐

  1. 【题解】P1080 国王游戏(贪心+高精python天下第一)

    P1080 国王游戏 题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排 ...

  2. 做题记(4)P1080 国王游戏

    今天,做了洛谷上的P1080 国王游戏,题目如下: 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整 ...

  3. 洛谷P1080 国王游戏(贪心)

    国王游戏 题目描述 恰逢 HHH 国国庆,国王邀请 nnn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 nnn 位大臣排成 ...

  4. P1080 国王游戏(贪心+高精度乘除及大数比较)

    https://www.luogu.org/problemnew/show/P1080 题目描述 恰逢 H 国国庆,国王邀请 n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数 ...

  5. 洛谷P1080 国王游戏 贪心+高精度

    https://www.luogu.org/problem/P1080 题目描述 恰逢 HH H国国庆,国王邀请n nn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王 ...

  6. P1080 国王游戏(贪心+大数乘除)

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...

  7. P1080 国王游戏

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...

  8. 洛谷P1080 国王游戏

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...

  9. [NOIP2012] 提高组 洛谷P1080 国王游戏

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...

  10. 洛谷 [NOIP2012 D1T2] P1080 国王游戏

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...

最新文章

  1. 怎么导入mysql示例_MySQL命令行导出导入数据库实例详解
  2. .Net 项目代码风格规范
  3. jquery eaayui 学习(三)tab
  4. kaggle notebook在git push时附带用户民和密码(一行搞定,全部写在一行中)
  5. WebService传输DataSet的一点想法和实践-.NET教程,Web Service开发
  6. C#开发笔记之07-如何实现交换2个变量的值而不引入中间变量?
  7. java二级分销排行统计_直播分销系统排行
  8. DiskCatalogMaker for Mac(磁盘管理工具)
  9. 日期无忧,Python计算日期清单
  10. 刘意 java基础视频_传智播客 2015年 刘意_Java基础视频-深入浅出精华版 笔记(day21~day23)(2016年4月8日13:28:21)...
  11. CommModify 串口监控,串口过滤,串口数据修改模拟,串口数据读写模拟,串口数据修改器 v3.2.3
  12. 实测PD18W/30W/65W充电器给iPhone xs充电快慢对比
  13. Mysql8中降序索引的底层实现
  14. BUUCTF Rabbit加密
  15. 美国oracle球场,【Dubnation翻译】甲骨文球馆的恢弘“绝唱”
  16. python爬虫——智联招聘(上)
  17. Java 是值传递还是引用传递
  18. 基于51单片机煤气天然气有毒气体检测系统蓝牙手机通信proteus仿真原理图PCB
  19. bedtools intersect用法详解
  20. 微信小程序开发之快递服务专栏(快递运力查询、寄快递、取消订单)

热门文章

  1. goldendict for linux,GoldenDict(for Linux)配置无道词典
  2. Windows 11的Android虚拟机
  3. 手撕栈,栈的实现(C语言)
  4. linux退出编辑菱宏,Confluence 6 空间中的常用宏
  5. 这个应该是目前最全的Tracking相关的文章了
  6. linux默认安装gdk目录,安装GDK
  7. 小米6内存测试软件,小米6采用的是eMMC还是UFS2.1?来测试一下吧
  8. 实验一 路由器的基本管理
  9. 如何在自己设置家里的路由器DNNS,并实现远程管理路由器。
  10. python创建excel图表_用python在Excel中创建图表