题解:P16953 「NLOI Round1」白鸟过河滩

381 字
2 分钟
题解:P16953 「NLOI Round1」白鸟过河滩

题面传送门:P16953 「NLOI Round1」白鸟过河滩

题目大意#

每组数据给定三组演唱效果与人数,求其商的最大值所在下标。

思路讲解#

首先肯定是要求对应值的商。
此处求商不能直接除,我们可以观察部分样例来得到原因。
5 6 9 3 4 5 这组样例若使用普通除法,即整除,所得结果应该是 11,而答案给出的是 33,这说明本题中算商需要浮点数的参与,因此需要改变数据存储方式。

接下来是对商进行打擂台找最值,并记录结果下标。此处不再赘述。

代码实现#

先说一下存储
#include<bits/stdc++.h>
using namespace std;
int t,maxp;
long double maxx,a[4],b[4];
int main(){
...
for(int z=1;z<=t;z++){
...
cin>>a[1]>>a[2]>>a[3]>>b[1]>>b[2]>>b[3];
...
}
return 0;
}

此处 aa 数组存演唱效果,bb 数组存人数。由于要算的商是一一对应的,所以使用数组也可以快速找到答案下标。

WARNING

数据点 44 达到 2×1092 \times 10^9,再求商后小数点后位数增长迅猛,double 类型极易溢出,应使用 long double。为防止运算精度问题,上方两数组也应顺便开成 long double。

完整代码
#include<bits/stdc++.h>
using namespace std;
int t,maxp;
long double maxx,a[4],b[4];
int main(){
cin>>t;
for(int z=1;z<=t;z++){
maxx=0;maxp=1;//多测不清空,_____
//小声BB:有可能三个商相等,根据编号最小的规则,应将变量 maxp 初始化为 1。
cin>>a[1]>>a[2]>>a[3]>>b[1]>>b[2]>>b[3];
for(int i=1;i<=3;i++){
if(a[i]/b[i]>maxx){
maxx=a[i]/b[i];
maxp=i;
}
}
cout<<maxp<<'\n';
}
return 0;
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

题解:P16953 「NLOI Round1」白鸟过河滩
https://zhedaotixuanbo.pages.dev/posts/题解:P16953 「NLOI Round1」白鸟过河滩/
作者
zhedaotixuanbo
发布于
2026-06-20
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
zhedaotixuanbo
这道题选什么? _____!
公告
分类
标签
站点统计
文章
17
分类
1
标签
21
总字数
6,295
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
ZTXB v1.0.0
文章许可
CC BY-NC-SA 4.0