P9740 题解(2023 激励计划评分 9)

· · 题解

P9740 「KDOI-06-J」ION 比赛

题目大意

比赛有 n 题,第 i 题满分 100,共有 a_i 个测试点,你已经做出 b_i 个测试点。这次比赛的 Au 线是 t 分。你决定死磕一道题目,问对于第 i 题,至少再做出多少个测试点,你才能达到 Au 线。

如果现在的分数已经达到 Au 线,输出 Already Au.。如果在一道题上,再怎么死磕都不可能达到 Au 线,输出 NaN

## 题目分析 如此小的数据范围,直接模拟即可,绝不会 TLE。 首先计算出已得到的分数 $sum$,如果 $\ge t$ 直接 `Already Au.`。 否则,还需得 $t-sum$ 分。 对第 $i$ 题,从 $1$ 到 $a_i-b_i$ 枚举多做出的测试点的数量,发现达到 Au 线就输出。如果直到 AC 第 $i$ 题,都不能达到 Au 线,那么第 $i$ 行就输出 `NaN`。 然后就做完了。 ## AC code: ```cpp #include<bits/stdc++.h> using namespace std; #define N 10 int n,a[N],b[N],t,sum,p,cnt; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%d%d",&a[i],&b[i]),sum+=(100/a[i]*b[i]); scanf("%d",&t);if(sum>=t){puts("Already Au.");return 0;} for(int i=1;i<=n;++i){ p=sum;cnt=0; while(p<t&&b[i]+cnt<=a[i])++cnt,p+=(100/a[i]); //每多过一个点,增加100/a[i]分。cnt是多过的测试点数量 if(b[i]+cnt==a[i]+1)puts("NaN"); //上面的循环在b[i]+cnt>a[i]时退出 //说明在b[i]+cnt==a[i],即AC第i题时,仍未达到Au线 else printf("%d\n",cnt); } return 0; } ``` ## 彩蛋 比赛开始一分钟时,我瞄着本题的样例看。突然感觉…… [小粉兔NOI2020游记](https://www.cnblogs.com/PinkRabbit/p/NOI2020.html) 没错,样例 $1$ 就是小粉兔在 NOI2020 中的成绩!(所以这题叫 ION 比赛啊) 还有,样例 $3,4$ 中的 Au 线 $509$,就是 NOI2023 的 Au 线。 $n\le 7$,自然是对应 NOI 比赛中的笔试,第一天三题,和第二天三题。 ## 后记 我看到有一些选手在算「还需多少测试点才能达到 Au 线」时使用数学方法,结果不慎写错,挂分。 **在数据范围小时,使用简单的模拟,避免挂分,才是最重要的**。