CF 732D

题目:

一堆考试,每个考试有复习时间,考试当天不能复习,考试有特定的时间,每门考试需要一个时间复习,求复习完并考试完的最小时间,否则输出-1 。

题解:

二分时间判断是否可行。

每次选择每场考试的最后一个时间,从最小的最后时间开始依次判断是否能复习完。

已经可以渐渐刷D了呢 :D   手感好像有所恢复诶

明天挑战一下E?

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct S{
    int bit,last;
}s[101000];

int arr[101000];
int prepare[101000];

int n,m;

bool cmp(S a,S b){
    return a.last<b.last;
}

bool cant(int x){
    for(int i=1;i<=m;i++){
        s[i].bit=i;
        s[i].last=0;
    }
    for(int i=0;i<x;i++){
        s[arr[i]].last=max(s[arr[i]].last,i+1);
    }
    sort(s+1,s+m+1,cmp);
    int ret=0;
    for(int i=1;i<=m;i++){
        ret+=prepare[s[i].bit];
        if(ret+i-1>=s[i].last) return true;
    }
    return false;
}

int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    for(int i=1;i<=m;i++){
        cin>>prepare[i];
    }
    int low=0;
    int high=n;
    while(high-low>1){
        int mid=(low+high)/2;
        if(cant(mid)) low=mid;
        else high=mid;
    }
    if(cant(low+1)) cout<<-1<<endl;
    else cout<<low+1<<endl;
}

阅读更多
个人分类: 贪心
上一篇CF 732C
下一篇CF 732C
想对作者说点什么? 我来说一句

易语言模块易语言模块

2010年08月14日 529KB 下载

没有更多推荐了,返回首页

关闭
关闭