题解 P2255 【[USACO14JAN]记录奥林比克Recording the M…】

2019-06-15 00:00:00 题解

我的独立博客来了 很水的贪心
  1. 先按照结束时间sort,因为越早结束的节目越好
  2. 选择接受的收音机是优先选择潜力小的收音机,因为潜力大的收音机留在后面可能更有用
  3. return 0;

下面是代码

#include<bit/stdc++.h>
using namespace std;

int read() {
    register int x=1,ans=0;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') x*=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){ans=ans*10+ch-48;ch=getchar();}
    return x*ans;
}

const int N=155;
struct dat {
    int a,b;
}d[N];
int cnt;

bool cmp(dat a,dat b) {
    if(a.b==b.b) return a.a>b.a;
    return a.b<b.b;
}

int main() {
    int n=read();
    for(register int i=1;i<=n;i++) {
        d[i].a=read(); d[i].b=read();
    }
    sort(d+1,d+n+1,cmp);
    int cpu0=0,cpu1=0;//不要问我为什么起这个名字,一开始我把这个抽象成了电脑cpu的多核调度,后来发现我的建模是错的......
    for(register int i=1;i<=n;i++) {
        if(cpu0<cpu1) {int t=cpu0; cpu0=cpu1; cpu1=t;}//将潜力小的收音机放在前面
        if(cpu0<=d[i].a) {//调用收音机1
            cnt++; cpu0=d[i].b;
        }
        else if(cpu1<=d[i].a) {//调用收音机2
            cnt++; cpu1=d[i].b;
        }
    }
    printf("%dn",cnt); 
    return 0;
}