P2123皇后游戏+P1080国王游戏
相对简单一点的国王游戏:题目链接
对于两位大臣时的情况,设国王的左右手分别为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,我们要按照这个顺序排好序,然后计算出最大值,在计算最大值时要解决高精度的问题,代码如下:
#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国王游戏相关推荐
- 【题解】P1080 国王游戏(贪心+高精python天下第一)
P1080 国王游戏 题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排 ...
- 做题记(4)P1080 国王游戏
今天,做了洛谷上的P1080 国王游戏,题目如下: 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整 ...
- 洛谷P1080 国王游戏(贪心)
国王游戏 题目描述 恰逢 HHH 国国庆,国王邀请 nnn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 nnn 位大臣排成 ...
- P1080 国王游戏(贪心+高精度乘除及大数比较)
https://www.luogu.org/problemnew/show/P1080 题目描述 恰逢 H 国国庆,国王邀请 n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数 ...
- 洛谷P1080 国王游戏 贪心+高精度
https://www.luogu.org/problem/P1080 题目描述 恰逢 HH H国国庆,国王邀请n nn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王 ...
- P1080 国王游戏(贪心+大数乘除)
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...
- P1080 国王游戏
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...
- 洛谷P1080 国王游戏
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...
- [NOIP2012] 提高组 洛谷P1080 国王游戏
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...
- 洛谷 [NOIP2012 D1T2] P1080 国王游戏
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...
最新文章
- 怎么导入mysql示例_MySQL命令行导出导入数据库实例详解
- .Net 项目代码风格规范
- jquery eaayui 学习(三)tab
- kaggle notebook在git push时附带用户民和密码(一行搞定,全部写在一行中)
- WebService传输DataSet的一点想法和实践-.NET教程,Web Service开发
- C#开发笔记之07-如何实现交换2个变量的值而不引入中间变量?
- java二级分销排行统计_直播分销系统排行
- DiskCatalogMaker for Mac(磁盘管理工具)
- 日期无忧,Python计算日期清单
- 刘意 java基础视频_传智播客 2015年 刘意_Java基础视频-深入浅出精华版 笔记(day21~day23)(2016年4月8日13:28:21)...
- CommModify 串口监控,串口过滤,串口数据修改模拟,串口数据读写模拟,串口数据修改器 v3.2.3
- 实测PD18W/30W/65W充电器给iPhone xs充电快慢对比
- Mysql8中降序索引的底层实现
- BUUCTF Rabbit加密
- 美国oracle球场,【Dubnation翻译】甲骨文球馆的恢弘“绝唱”
- python爬虫——智联招聘(上)
- Java 是值传递还是引用传递
- 基于51单片机煤气天然气有毒气体检测系统蓝牙手机通信proteus仿真原理图PCB
- bedtools intersect用法详解
- 微信小程序开发之快递服务专栏(快递运力查询、寄快递、取消订单)
热门文章
- goldendict for linux,GoldenDict(for Linux)配置无道词典
- Windows 11的Android虚拟机
- 手撕栈,栈的实现(C语言)
- linux退出编辑菱宏,Confluence 6 空间中的常用宏
- 这个应该是目前最全的Tracking相关的文章了
- linux默认安装gdk目录,安装GDK
- 小米6内存测试软件,小米6采用的是eMMC还是UFS2.1?来测试一下吧
- 实验一 路由器的基本管理
- 如何在自己设置家里的路由器DNNS,并实现远程管理路由器。
- python创建excel图表_用python在Excel中创建图表