2020 HZNU Winter Training Day 10

D题:CodeForces 1121C

题解:

由于本题数据量较小,可以采用暴力枚举时间的方法,其实就是一道模拟题,枚举秒。

记录是第几个任务,并判断记录当前任务处理到第几个测试点。

在每一秒,判断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);

}
View Code

 

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);


    }
    
}
View Code

 

posted @ 2020-02-07 15:37  Fzzf1  阅读(144)  评论(0编辑  收藏  举报