1 条题解

  • 0
    @ 2025-8-24 22:51:21

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar zyn_
    而最终,一切往事都被追忆。

    搬运于2025-08-24 22:51:21,当前版本为作者最后更新于2023-10-14 20:07:04,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P9740 「KDOI-06-J」ION 比赛

    题目大意

    比赛有 nn 题,第 ii 题满分 100100,共有 aia_i 个测试点,你已经做出 bib_i 个测试点。这次比赛的 Au 线是 tt 分。你决定死磕一道题目,问对于第 ii 题,至少再做出多少个测试点,你才能达到 Au 线。

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

    n7,ai100n\le 7,a_i\le 100

    题目分析

    如此小的数据范围,直接模拟即可,绝不会 TLE。

    首先计算出已得到的分数 sumsum,如果 t\ge t 直接 Already Au.

    否则,还需得 tsumt-sum 分。

    对第 ii 题,从 11aibia_i-b_i 枚举多做出的测试点的数量,发现达到 Au 线就输出。如果直到 AC 第 ii 题,都不能达到 Au 线,那么第 ii 行就输出 NaN

    然后就做完了。

    AC code:

    #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游记

    没错,样例 11 就是小粉兔在 NOI2020 中的成绩!(所以这题叫 ION 比赛啊)

    还有,样例 3,43,4 中的 Au 线 509509,就是 NOI2023 的 Au 线。

    n7n\le 7,自然是对应 NOI 比赛中的笔试,第一天三题,和第二天三题。

    后记

    我看到有一些选手在算「还需多少测试点才能达到 Au 线」时使用数学方法,结果不慎写错,挂分。

    在数据范围小时,使用简单的模拟,避免挂分,才是最重要的

    • 1

    信息

    ID
    9084
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者