2020 HZNU Winter Training Day 10
题解:
由于本题数据量较小,可以采用暴力枚举时间的方法,其实就是一道模拟题,枚举秒。
记录是第几个任务,并判断记录当前任务处理到第几个测试点。
在每一秒,判断k个任务中是否有符合条件的情况出现,从而得出ans来。
注意:利用vis数组,防止重复运算。
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=2e5+10; int a[MAXN],b[MAXN],c[MAXN]; int vis[MAXN]; int main(){ int n,k; int t=0,d,ans=0; scanf("%d %d",&n,&k); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=k;i++){ b[i]=a[i]; } d= k+1; while(t<n){ int q=t*100.0/n+0.5; for(int i=1;i<=k;i++){ if(b[i]){ c[i]++; if(c[i]==q&&!vis[i]){ ans++; vis[i]=1; } if(c[i]>=b[i]){ vis[i]=0; c[i]=0; b[i]=a[d]; d++; t++; } } } } printf("%d\n",ans); }
C题:CodeForces 1103B
题解:本题想要找到符合的条件的答案,可通过x和y找到其所在的区间,因此不断列举区间,找到其所在区间,通过二分找出答案。
原理:若结果大于y,则一定返回y,否则返回x,因此可以此判断是否在这个区间中
#include<algorithm> #include<stdio.h> #include<iostream> #include<string> using namespace std; char judge(int x,int y){ char rs; printf("? %d %d\n",x,y); fflush(stdout); cin>>rs; return rs; }//判断结果 int main(){ string s; while(cin>>s){ if(s=="end") break; int l=0,r=1; while(judge(l,r)=='y'){ l=r; r*=2; }//若结果大于y,则返回y,否则返回x,因此可以此判断是否在这个区间中 while(l<r-1){ int mid=(l+r)/2; if(judge(mid,r)=='x') l=mid; else r=mid; }//找到区间后在该区间二分查找答案,原理上同 printf("! %d\n",r); fflush(stdout); } }