1. 程式人生 > >Codeforces 845 C. Two TVs 思路:簡單貪心演算法

Codeforces 845 C. Two TVs 思路:簡單貪心演算法

題目:

題目原文連結:http://codeforces.com/contest/845/problem/C

題意:現在我們有一個電視清單,有兩個電視,電視清單上有每一個節目的開始時間和結束時間。

   電視不能接連不間斷的播放,例如TV1播放完1-2點的節目後不能接著播放2-3點的電視,除非在TV2上播放,如果TV2也正在播放則不能播放完清單。

思路:

  1.對清單排序,讓開始時間早的靠前,如果開始時間相同,結束時間早的靠前。

  2.如果TV1已經結束。就把這一個節目的結束時間賦給TV1,然後看下一個節目。

  3.如果TV1尚未結束,TV2已經結束。就把這一個節目的結束時間賦給TV2,然後看下一個節目。

  4.如果TV1、TV2都尚未結束。就輸出NO,不再看下一個節目。

程式碼:

#include <bits\stdc++.h>
using namespace std;

struct node{
    int l;int r;
}a[200005];

bool cmp(node a,node b){
    if(a.l == b.l) return a.r < b.r;
    return a.l < b.l;
}

int main(){
    int n;
    cin >> n;
    for(int i = 0;i < n; i++){
        cin 
>> a[i].l >> a[i].r; } sort(a,a+n,cmp); //對清單排序,讓開始時間早的靠前,如果開始時間相同,結束時間早的靠前。 int r1 = -1,r2 = -1; //初始化上一個節目結束的時間 for(int i = 0;i < n; i++){ if(r1 < a[i].l){ //如果TV1已經結束。就把這一個節目的結束時間賦給TV1,然後看下一個節目。 r1 = a[i].r; continue; }
if(r2 < a[i].l){ //如果TV1尚未結束,TV2已經結束。就把這一個節目的結束時間賦給TV2,然後看下一個節目。 r2 = a[i].r; continue; } cout << "NO" << endl;//如果TV1、TV2都尚未結束。就輸出NO,不再看下一個節目。 return 0; } cout << "YES" << endl; return 0; }