• poj2376Cleaning Shifts (贪心求解)


    描述
    大表哥分配 N (1 <= N <= 25,000) 只中的一些奶牛在牛棚附近做些清洁。 他总是要让至少一只牛做清洁。他把一天分成T段(1 <= T <= 1,000,000), 第一段是1,最后一段是T

    每只奶牛只在一些时间段有空。奶牛如果选择某一段时间,则必须完成整段时间的工作

    你的任务是帮助FJ安排一些奶牛,使每段时间至少有一只奶牛被安排来做这件事。并且奶牛数应尽可能小。如果不可能办到,输出-1
    输入
    注意,输入包含多组测试数据,请处理到文件结束

    • 第一行:N和T
    • 第二行至N+1行: 每一行包括奶牛能工作的开始和结束时间。闭区间。
      输出
      *每组数据一行,输出完成清洁所需最少的奶牛数,如果不可能办到,输出-1
      样例输入
      3 10
      1 7
      3 6
      6 10
      样例输出
      2
      提示
      这道题输入数据很多,请用scanf而不是cin

    输入说明

    这里有3只奶牛和10个时间段cow #1 能在时间段1..7工作, cow #2 能在时间段3..6工作, cow #3 能在时间段6..10工作

    输出说明:

    选择 cows #1 和 #3即可,没有更优的方案了 .

    AC代码:

    include

    include

    include

    using namespace std;
    int t[1000005]; //t[i]表示以i开始的所有的牛中结束最晚的牛的值
    int main(){
    int N,T;
    while(cin>>N>>T){
    memset(t,-1,sizeof(t)); //初始化-1
    while(N--){
    int a,b;
    scanf("%d%d",&a,&b);
    if(t[a]<b) t[a]=b;
    }
    int len=0,las=0,s=0,plug=0;//plug标记量变为1则输出-1,w为0则输出s;s:贪心求解得出的最少奶牛数;len开始时间,las结束时间;
    while(1){
    int maxn=0,x; //maxn标记最大值,x标记取得最大值时的i
    for(int i=las+1;i>len;i--){
    if(t[i]>maxn) maxn=t[i],x=i;
    }
    if(maxn<=las) {
    plug=1;
    break;
    }
    s++;
    len=x;
    las=maxn;
    if(las==T) break;
    }
    if(plug) printf("-1 ");
    else printf("%d ",s);
    }
    return 0;
    }

    直接贪心求解就好


    作者:孙建钊
    出处:http://www.cnblogs.com/sunjianzhao/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    根据数据类型选择特征 select_dtypes(include=[]/exclude=[])
    quantile()
    concat()、merge()的区别
    json.dumps()和json.loads()
    Linux-top命令详解
    性能测试总结(一)---基础理论篇
    jmeter-常见问题及解决方法
    Jmeter之Bean shell使用(五)
    Jmeter-内存溢出原因及解决方法
    JMeter- JDBC Request
  • 原文地址:https://www.cnblogs.com/sunjianzhao/p/11412385.html
Copyright © 2020-2023  润新知