vijos1779国王游戏
描述
恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这n位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
格式
输入格式
第一行包含一个整数n,表示大臣的人数。
第二行包含两个整数a和b,之间用一个空格隔开,分别表示国王左手和右手上的整数。接下来n行,每行包含两个整数a和b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
输出格式
输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
输入:
3
1 1
2 3
7 4
4 6
输出:
2
思路:将大臣按左右手整数之积从小到大排序,为解决溢出问题,采用C++大数。
#include <iostream>
#include <iomanip>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAXN=;
const int BASE=;
const int LEN=;
struct BigInt{
int e[MAXN],len;
BigInt()
{
memset(e,,sizeof(e));
len=;
}
void set(int x)
{
memset(e,,sizeof(e));
len=;
while(x>)
{
e[len++]=x%BASE;
x/=BASE;
}
}
bool operator>(const BigInt &b)
{
if(len>b.len)
{
return true;
}
else if(len==b.len)
{
for(int i=len-;i>=;i--)
{
if(e[i]>b.e[i]) return true;
else if(e[i]<b.e[i]) return false;
else ;
}
return false;
}
else
{
return false;
}
}
BigInt operator*(const BigInt &b)
{
BigInt res;
for(int i=;i<len;i++)
{
int up=;
for(int j=;j<b.len;j++)
{
int z=e[i]*b.e[j]+up+res.e[i+j];
res.e[i+j]=z%BASE;
up=z/BASE;
}
if(up!=) res.e[i+b.len]=up;
}
res.len=len+b.len;
while(res.len>&&res.e[res.len-]==) res.len--;
return res;
}
BigInt operator/(const int &b)
{
BigInt res=*this;
int carry=;
for(int i=len-;i>=;i--)
{
res.e[i]+=carry*BASE;
carry=res.e[i]%b;
res.e[i]/=b;
}
while(res.len>&&res.e[res.len-]==) res.len--;
return res;
}
friend ostream &operator<<(ostream &out,const BigInt &b)
{
out<<b.e[b.len-];
for(int i=b.len-;i>=;i--)
{
out<<setw(LEN)<<setfill('')<<b.e[i];
}
out<<endl;
return out;
}
};
struct Node{
int x,y;
}mon[MAXN];
bool comp(const Node &a,const Node &b)
{
return a.x*a.y < b.x*b.y;
}
int n,kl,kr;
int main()
{
cin>>n;
cin>>kl>>kr;
for(int i=;i<n;i++)
{
cin>>mon[i].x>>mon[i].y;
}
sort(mon,mon+n,comp);
BigInt res;
res.set();
BigInt mul;
mul.set(kl);
for(int i=;i<n;i++)
{
BigInt tmp;
tmp=mul/mon[i].y;
if(tmp>res) res=tmp;
BigInt b;
b.set(mon[i].x);
mul=mul*b;
}
cout<<res<<endl;
return ;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct BigInt{
static const int SIZE = ;
int e[SIZE], len;
BigInt()
{
len = ;
memset(e, , sizeof(e));
}
void reset(int x)
{
while(x > )
{
e[len++] = x % SIZE;
x /= SIZE;
}
while(len > && e[len-] == ) len--;
}
bool operator>(const BigInt& b)
{
if(len > b.len) return true;
else if(len < b.len) return false;
else
{
for(int i = len - ; i >= ; i--)
{
if(e[i] == b.e[i]) continue;
else if(e[i] > b.e[i]) return true;
else return false;
}
}
return false;
}
BigInt operator*(const BigInt& b)
{
BigInt ret;
for(int i = ; i < len; i++)
{
int up = ;
for(int j = ; j < b.len; j++)
{
int z = e[i] * b.e[j] + ret.e[i+j] + up;
ret.e[i+j] = z % SIZE;
up = z / SIZE;
}
if(up != )
{
ret.e[i + b.len] = up;
}
}
ret.len = len + b.len;
while(ret.len > && ret.e[ret.len-] == ) ret.len--;
return ret;
}
BigInt operator/(int b)
{
BigInt ret = *this;
int carry = ;
for(int i = len - ; i >=; i--)
{
ret.e[i] += carry * SIZE;
carry = ret.e[i] % b;
ret.e[i] /= b;
}
while(ret.len > && ret.e[ret.len - ] == ) ret.len--;
return ret;
}
void print()
{
printf("%d", e[len-]);
for(int i = len - ; i >= ; i--)
{
printf("%04d", e[i]);
}
printf("\n");
}
};
const int MAXN = ;
struct Node{
int x, y;
}nod[MAXN];
int n, kl, kr;
bool comp(Node a, Node b)
{
return a.x * a.y < b.x * b.y;
}
int main()
{
scanf("%d %d %d", &n, &kl, &kr);
for(int i = ; i < n; i++)
{
scanf("%d %d", &nod[i].x, &nod[i].y);
}
sort(nod, nod + n, comp);
BigInt res, mul;
res.reset(kl / nod[].y);
mul.reset(kl);
for(int i = ; i < n; i++)
{
BigInt b;
b.reset(nod[i-].x);
mul = mul * b;
BigInt score = mul / nod[i].y;
if(score > res)
{
res = score;
}
}
res.print();
return ;
}
vijos1779国王游戏的更多相关文章
- NOIP2012 国王游戏
2国王游戏 (game.cpp/c/pas) [问题描述] 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数 ...
- 【NOIP 2012 国王游戏】 贪心+高精度
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...
- Codevs 1198 国王游戏 2012年NOIP全国联赛提高组
1198 国王游戏 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 恰逢 H 国国庆,国王邀 ...
- Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)
Luogu 1080 [NOIP2012]国王游戏 (贪心,高精度) Description 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己 ...
- NOIP国王游戏
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...
- AC日记——国王游戏 洛谷 P1080
国王游戏 思路: 贪心+高精: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 struct Dat ...
- Luogu P1080国王游戏(贪心)
国王游戏 题目链接:国王游戏 ps:题目数据说明了要写高精度. 这个题的答案是\(a.l * a.r < b.l * b.r\)按照这个进行排序 题解中大部分只是如何证明排序是: \(a.l * ...
- 国王游戏 2012年NOIP全国联赛提高组(贪心+高精)
P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成 ...
- 【题解】洛谷 P1080 国王游戏
目录 题目 思路 \(Code\) 题目 P1080 国王游戏 思路 贪心+高精度.按\(a \times b\)从小到大排序就可以了. \(Code\) #include<bits/stdc+ ...
随机推荐
- DNN优势
- 还在用 kill -9 停机?这才是最优雅的姿势(转)
_ 最近瞥了一眼项目的重启脚本,发现运维一直在使用 kill-9<pid> 的方式重启 springboot embedded tomcat,其实大家几乎一致认为:kill-9<pi ...
- PAT 组合数的和(15)
给定N个非0的个位数字,用其中任意2个数字都可以组合成1个2位的数字.要求所有可能组合出来的2位数字的和.例如给定2.5.8,则可以组合出:25.28.52.58.82.85,它们的和为330. 输入 ...
- ALV调用的几个函数
转 ALV的调用主要由以下几个标准函数实现,所有函数的输入输出参数必须大写,否则系统会出现异常中止,相关函数如下: 1)REUSE_ALV_FIENDCATALOG_MERGE:根据内表结构返回FI ...
- 坑爹的Hibernate 映射文件错误提示org.xml.sax.SAXParseException
今天整整一个上午都在和hibernate做斗争,早上一来,继续昨天的项目开发,发现spring项目不能启动,从错误中看是hibernate错误,多半是hibernate配置有错误,关键是错误提示中显示 ...
- linux下查找最耗iowait的进程
抓哪个进程干坏事前要先停掉syslogservice syslog stop 打开block dump:echo 1 > /proc/sys/vm/block_dump 统计:dmesg | e ...
- vim中设置tab的长度的方法
linux下使用vim编程是比較常见的事情,但vim默认的tab是8个空格.但一般的编辑器是4个空格,所以希望改动下.详细方法例如以下:1. 创建文件名称为 .vimrc 的系统文件首先切换到用户根文 ...
- python基础7 ---python函数
python基础知识 一.闭包函数 1.闭包函数的定义:在一个内部函数中,在对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包. 2.闭包函数的特点:自带作用域和延迟计算 补 ...
- python SimpleHTTPServer 快速共享文件
简单介绍 通过一个python命令快速共享文件给他人. 操作步骤 1.打开cmd命令行,切换到需要共享文件的目录,执行命令 python -m SimpleHTTPServer . 2.打开浏览器,在 ...
- [原创]java WEB学习笔记35:java WEB 中关于绝对路径 和相对路径问题
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...