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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现