P9740 题解(2023 激励计划评分 9)
zyn_
·
·
题解
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 线」时使用数学方法,结果不慎写错,挂分。
**在数据范围小时,使用简单的模拟,避免挂分,才是最重要的**。