CF1121C

题意

有 $n$ 份代码正在评测队列中,评测机可以同时评测 $k$ 份代码,第 $i$ 份代码对应的题目的测试点数量为 $a_i$,每个测试点的测试需要 $1$ 秒,对于第 $i$ 秒,定义 $d=\lfloor\frac{100\times m}{n}+0.5\rfloor$,其中 $m$ 是已经评测完的代码的数量,若一份代码正在评测它的第 $p$ 个测试点且 $p=q$ ,则称其为有趣的代码,问有多少份代码是有趣的。

思路

观察数据范围发现: $1\le n\le 1000,1\le k\le 100,1\le a_i \le 150$,显然,评测完所有代码所需时间为 $\lceil \frac{\sum^{i\le n}_{i=1}}{k} \rceil$,当 $k=1,n=1000,a_i=150$ 时,所需时间为 $\frac{1000\times 150}{1}=150000$,所以暴力枚举每一秒,计算当前正在评测的代码是否为有趣的代码即可。

时间复杂度约为 $O(n^2a_i)$,极限约为 $1.5\times 10^8$,足以通过本题。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5,maxa=155,maxt=maxn*maxa;
int n,k,a[maxn],ans,finish,start[maxn];
bool ok[maxn];//是否评测完成
bool tj[maxn];//是否被统计过
int main() {
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n; i++)scanf("%d",&a[i]);
    int ed=k;//当前评测到了哪一份代码
    for(int i=1; i<=maxt; i++) {
        int nw=0,m=min(ed,n);
        int d=floor((finish*100.0/n)+0.5);
        for(int j=1; j<=m; j++){
            if(!ok[j]){
                if(i-start[j]==d&&!tj[j]){
                    ans++;
                    tj[j]=1;
                } 
            } 
            if(i-start[j]==a[j]){
                ok[j]=1,nw++;
            }
        }
        finish+=nw,ed+=nw;//加上该秒评测完成的代码
        for(int j=1; j<=min(ed,n); j++){
            if(!start[j]&&j>k)start[j]=i;//记录开始评测时间
        }
    }
    printf("%d",ans);
}
posted @   changwenxuan  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示