博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NOIP2012] 国王游戏
阅读量:6186 次
发布时间:2019-06-21

本文共 1233 字,大约阅读时间需要 4 分钟。

题意:有一个国王和n个大臣,排成一列玩一个,每个人左右手分别有一个数值,每个人的分值定义为之前所有人左手的分值和除以自己右手的分值(下取整),国王始终站在最前面,现要你安排大臣的顺序,使得分值最大的大臣的分值尽量小

题解:

贪心+高精

按左右手乘积从小到大排序

所有数的乘积最大不超过\(10^{4000}\),码一发高精乘低精和高精除低精即可

注意:比较s和g时写成函数会wa,可能传指针的时候会有鬼畜的事情发生= =、

#include
#include
#include
#include
#include
#include
#define N 5000using namespace std;int g[N],f[N],s[N];struct Node { int a,b; bool operator < (const Node &x) const { return a*b
'9')) ch=getchar(); if(ch=='-') o=-1; while(ch>='0' && ch<='9') x=10*x+ch-'0',ch=getchar(); return x*o;}void work(int u) { int a=p[u].a,b=p[u].b,x=0,flg=0; memset(s,0,sizeof(s)); for(int i=f[0]; i>=1; i--) { x=10*x+f[i]; if(x/b) { s[i]=x/b,x-=b*(x/b); if(!flg) flg=1,s[0]=i; } } if(g[0]
=1; i--) { if(g[i]
s[i]) break; } } x=0; for(int i=1; i<=f[0]; i++) { f[i]=f[i]*a+x; x=f[i]/10,f[i]%=10; } while(x) f[++f[0]]=x%10,x/=10;}int main() { int n=gi(),x=gi(),y=gi(); for(int i=1; i<=n; i++) { p[i].a=gi(),p[i].b=gi(); } sort(p+1,p+n+1); while(x) f[++f[0]]=x%10,x/=10; for(int i=1; i<=n; i++) work(i); if(!g[0]) printf("0"); else for(int i=g[0]; i>=1; i--) { printf("%d", g[i]); } return 0;}

转载于:https://www.cnblogs.com/HLXZZ/p/7630565.html

你可能感兴趣的文章
javascript的数据结构快速学-栈和队列
查看>>
数据结构与算法-自适应二叉树
查看>>
算法(三):图解广度优先搜索算法
查看>>
Vue 安装
查看>>
DOM 中的范围
查看>>
Retrofit源码解读(二)--Retrofit中网络通信相关
查看>>
1.2逻辑结构和物理结构
查看>>
【Android】APT(编译时生成代码)
查看>>
直播多人连麦技术简介
查看>>
《自动化办公》两秒完成250页豆瓣电影PPT
查看>>
作为前端,你不得不知道的搜索引擎优化
查看>>
编译deno,deno结构解析
查看>>
推动快递保价大众化,顺丰、京东、通达系谁更彻底?
查看>>
Qtum量子链研究院:Qtum Plasma MVP 技术详解
查看>>
VR全景图片浏览实现
查看>>
【译】 WebSocket 协议第九章——扩展(Extension)
查看>>
深入call apply bind
查看>>
22. Generate Parentheses
查看>>
函数运行环境系统动态链接库版本太低?函数计算 fun 神助力分忧解难
查看>>
如何让自己看起来更专业?前端程序员必须了解的几个“词语”
查看>>