Codeforces 845 C. Two TVs 思路:簡單貪心演算法
阿新 • • 發佈:2019-01-23
題目:
題目原文連結: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; }