传送

最大值最小什么的一看就是二分了qwq

然鹅并不知道怎么检查,所以我们换个思路

我们要求出最小的最大值,这肯定和大臣的排列有关,会不会有什么规律?

先看看只有两个大臣的情况

排列:1 2,ans1=max{a0/b1,a0a1/b2}

排列:2 1,ans2=max{a0/b2,a0a2/b1}

显然a0/b1<a0a2/b1,a0/b2<a0a1/b2,所以最大值取决于a0a1/b2和a0a2/b1

为了让最大值最小,当ans1>ans2的时候,我们就会调换1,2的顺序

所以就是a0a1/b2>a0a2/b1,也就是a1b1>a2b2的时候就会调换。

综上可得按照a*b从小到大排序

其实这个题的难点不在排序思路,在于高精。

a,b<10000,n<1000,最坏情况ans=100001000,爽

建议结合代码食用

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. ll read()
  5. {
  6. char ch=getchar();
  7. ll x=;bool f=;
  8. while(ch<''||ch>'')
  9. {
  10. if(ch=='-')f=;
  11. ch=getchar();
  12. }
  13. while(ch>=''&&ch<='')
  14. {
  15. x=(x<<)+(x<<)+(ch^);
  16. ch=getchar();
  17. }
  18. return f?-x:x;
  19. }
  20. struct rr
  21. {
  22. ll a,b;
  23. }ren[];
  24. ll n,aa,bb,sa[],now[],ma[],lenm=,lens=,lenn=;//sa记录大臣们左手上的数的乘积,now记录当前大臣的金币,ma记录最大值
  25. bool cmp(rr t,rr w)
  26. {
  27. return t.a*t.b<w.a*w.b;
  28. }
  29. //以下是高精
  30. void cheng(ll k)//高精乘
  31. {
  32. sa[]*=k;
  33. for(int i=;i<=lens;i++)
  34. {
  35. sa[i]=sa[i-]/+sa[i]*k;
  36. sa[i-]%=;
  37. }
  38. while(sa[lens]>=)
  39. {
  40. lens++;
  41. sa[lens]=sa[lens-]/;
  42. sa[lens-]%=;
  43. }
  44. }
  45. void chu(ll k)
  46. {
  47. int j=,x=;
  48. memset(now,,sizeof(now));
  49. for(int i=lens;i>=;i--)
  50. {
  51. j++;
  52. x=x*+sa[i];
  53. now[j]=x/k;
  54. x=x-now[j]*k;
  55. }
  56. for(int i=;i<=j/;i++)//由于高精除单精是从第一位表示高位,所以要把now反过来,注意是i<=j/2,不是i<=j
  57. {
  58. int tmp=now[i];
  59. now[i]=now[j-i+];
  60. now[j-i+]=tmp;
  61. }
  62. while(now[j]==&&j>)
  63. j--;
  64. lenn=j;
  65. }
  66. void max_()//进行比较
  67. {
  68. if(lenn>lenm)
  69. {
  70. for(int i=lenn;i>=;i--)
  71. ma[i]=now[i];
  72. lenm=lenn;//别漏了
  73. return ;
  74. }
  75. if(lenn<lenm) return ;
  76. for(int i=lenn;i>=;i--)
  77. {
  78. if(now[i]<ma[i])
  79. break;
  80. if(now[i]>ma[i])//找到第一位比ma对应位小的
  81. {
  82. for(int j=i;j>=;j--)
  83. {
  84. ma[j]=now[j];
  85. }
  86. return ;
  87. }
  88. }
  89. return ;
  90. }
  91. int main()
  92. {
  93. sa[]=;
  94. n=read();ren[].a=read();ren[].b=read();
  95. for(int i=;i<=n;i++)
  96. ren[i].a=read(),ren[i].b=read();
  97. sort(ren+,ren++n,cmp);
  98. for(int i=;i<=n;i++)
  99. {
  100. cheng(ren[i-].a);
  101. chu(ren[i].b);
  102. max_();
  103. }
  104. for(int i=lenm;i>=;i--)
  105. printf("%lld",ma[i]);
  106. }

P1080国王游戏的更多相关文章

  1. 【题解】洛谷 P1080 国王游戏

    目录 题目 思路 \(Code\) 题目 P1080 国王游戏 思路 贪心+高精度.按\(a \times b\)从小到大排序就可以了. \(Code\) #include<bits/stdc+ ...

  2. P1080 国王游戏 (等待高精度AC)

    P1080 国王游戏 题解 贪心策略:按照大臣左右手数字乘积从小到大排序 假设我们已经把大臣排了一个顺序 假定在这个顺序下我们可以保证  得到奖赏最多的大臣所得奖赏最少 那么我们一旦交换任意两个大臣, ...

  3. 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山

    前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...

  4. Luogu P1080国王游戏(贪心)

    国王游戏 题目链接:国王游戏 ps:题目数据说明了要写高精度. 这个题的答案是\(a.l * a.r < b.l * b.r\)按照这个进行排序 题解中大部分只是如何证明排序是: \(a.l * ...

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

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

  6. [贪心][高精]P1080 国王游戏(整合)

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

  7. P1080 国王游戏 贪心 高精度

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

  8. 洛谷 P1080 国王游戏

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

  9. luogu P1080 国王游戏

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

  10. 洛谷—— P1080 国王游戏

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

随机推荐

  1. QT DBUS: Not connected to D-Bus server, 注意source /etc/profile

    运行环境:ARM 运行如下代码: QDBusConnection bus = QDBusConnection::sessionBus(); if(!bus.registerService(" ...

  2. C语言数组名取地址。。。

    int main(){ int a[5] = { 1, 2, 3, 4, 5 }; printf("%08X ,%08X ,%08X ,%08X", a, &a, a + ...

  3. SharePoint自己定义程序页面部署 不用重新启动IIS

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/dz45693/article/details/30840255 SharePoint的部署方式默认是 ...

  4. C#GC垃圾回收和析构函数和IDisposable的使用

    一,什么是GC 1,GC是垃圾回收器,一般来说系统会自动检测不会使用的对象或变量进行内存的释放,不需要手动调用,用Collect()就是强制进行垃圾回收,使内存得到及时的释放,让程序效率更高. 2,G ...

  5. POI读取文件的最佳实践

    POI是 Apache 旗下一款读写微软家文档声名显赫的类库.应该很多人在做报表的导出,或者创建 word 文档以及读取之类的都是用过 POI.POI 也的确对于这些操作带来很大的便利性.我最近做的一 ...

  6. ThinkPHP中的display()和fetch()的区别

    fetch()传入的参数是模板名,用模板文件来输出; display()传入的是字符串,输出传递的内容.

  7. STM32F407 跑马灯实验

    1.库函数版本调用的函数有哪些?对应的源文件/头文件是哪个? 库函数 源文件 头文件 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE) stm3 ...

  8. 个人第二次作业-c++实现四则运算生成器

    c++实现四则运算生成器 GIT地址 Link Git用户名 Redwarx008 学号后五位 61128 博客地址 Link 作业链接 Link 环境配置 使用VS2019社区版,一键式安装,这里不 ...

  9. activity manager

    首先 activity manager 作为一个独立的服务存在,所有系统中的所有 app 的 activity 都通过这个 service 来管理 同时 activity manager 维护着多个 ...

  10. GUI学习之二十九—QFileDialog学习总结

    今天学习的是文件对话框——QFileDialog 一.描述 QFileDialog提供了一个对话框,允许用户选择文件或者目录,也允许用户遍历文件系统,用以选择一个或多个文件或者目录. QFileDia ...