洛谷刷题C++语言 | P1080 国王游戏
文章标签:
c++刷题软件
学习C++从娃娃抓起!记录下洛谷C++学习和备考过程中的题目,记录每一个瞬间。
附上汇总贴:洛谷刷题C++语言 | 汇总_热爱编程的通信人的博客-CSDN博客
【题目描述】
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
【输入】
第一行包含一个整数 n,表示大臣的人数。
第二行包含两个整数 a 和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
【输出】
一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
【输入样例】
3
1 1
2 3
7 4
4 6
【输出样例】
2
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, slen=1, s[1000000]={1}, ans[1000000];
struct people {
int a, b;
}p[1005];
bool cmp(people p1, people p2)
{
return p1.a*p1.b<p2.a*p2.b;
}
void mul(int n)
{
int tmp = 0;
for (int i=0; i<slen; i++) { //先将每一位的乘积求出来
s[i] *= n;
}
for (int i=0; i<slen; i++) { //除最高位,处理每一位
tmp = tmp + s[i];
s[i] = tmp % 10;
tmp = tmp / 10;
}
while (tmp!=0) { //处理最高位
s[slen] = tmp % 10;
slen++;
tmp = tmp / 10;
}
return;
}
void div(int n) //借位取余
{
int tmp = 0;
for (int i=slen-1; i>=0; i--) {
tmp = tmp * 10 + s[i];
ans[i] = tmp / n;
tmp = tmp % n;
}
return;
}
void print()
{
int tmp = slen;
if (slen==1) {
if (s[slen-1]==1) {
cout << 0;
return;
}
}
while (ans[tmp]==0) {
tmp--;
if (tmp==-1) {
cout << 1;
}
}
for (int i=tmp; i>=0; i--) {
cout << ans[i];
}
return;
}
int main()
{
cin >> n;
for (int i=0; i<=n; i++) {
cin >> p[i].a >> p[i].b;
}
sort(p+1, p+n+1, cmp);
for (int i=0; i<n; i++) {
mul(p[i].a);
}
div(p[n].b);
print();
return 0;
}
【运行结果】
3
1 1
2 3
7 4
4 6
2