zoukankan      html  css  js  c++  java
  • UVa10020 Minimal coverage **

     1 /*
    2 * Uva-10020 最少区间覆盖-贪心
    3 *
    4 * 很直接的贪心。。 详见刘汝佳 《奥赛入门经典》
    5 *
    6 * 测试数据: http://www.algorithmist.com/index.php/UVa_10020#Input
    7 *
    8 */
    9
    10 #include <cstdio>
    11 #include <algorithm>
    12 using namespace std;
    13
    14 const int maxN = 100000 + 5;
    15 int caseNum, m, intervalNum, ansList[maxN];
    16
    17 struct SData{
    18 int x, y;
    19 };
    20 SData interval[maxN];
    21
    22 bool cmp(const SData lhs, const SData rhs){
    23 return lhs.x < rhs.x;
    24 }
    25
    26 int main(){
    27 scanf("%d", &caseNum);
    28 while(caseNum--){
    29 scanf("%d", &m);
    30
    31 intervalNum = 0;
    32 int tmpX, tmpY;
    33 while(scanf("%d%d", &tmpX, &tmpY)){
    34 if(tmpX == 0 && tmpY == 0)
    35 break;
    36
    37 interval[intervalNum].x = tmpX;
    38 interval[intervalNum++].y = tmpY;
    39 }
    40
    41 sort(interval, interval + intervalNum, cmp);
    42
    43 int cover = 0, cur = 0, nextCover, nextCoverNum, i, ans = 0;
    44 bool covered = 0; //注意初始化!!在这里WA了一次
    45 while(cur < intervalNum){
    46 nextCover = cover;
    47 i = cur;
    48 while(i < intervalNum && interval[i].x <= cover){
    49 if(interval[i].y > nextCover){
    50 nextCover = interval[i].y;
    51 nextCoverNum = i;
    52 }
    53 i++;
    54 }
    55 if(i == cur) break;
    56
    57 cover = nextCover;
    58 ansList[ans++] = nextCoverNum;
    59 cur = i;
    60 if(cover >= m){
    61 covered = 1;
    62 break;
    63 }
    64 }
    65 if(covered){
    66 printf("%d\n", ans);
    67 for(int j=0; j<ans; j++){
    68 printf("%d %d\n", interval[ansList[j]].x, interval[ansList[j]].y);
    69 }
    70 }
    71 else printf("0\n");
    72 if(caseNum > 0) printf("\n");
    73
    74 }
    75
    76
    77 return 0;
    78 }

        

     1 /*
    2 另外,针对区间端点为整数的情形, 可以直接用数组存,不用排序,O(n)时间内解决。
    3 即interval[i] = j, 表示以左端点为i的区间的右端点最大值为j。。
    4 */
    5 #include <cstdio>
    6 #include <cstring>
    7 using namespace std;
    8
    9 const int maxn = 50000 + 10;
    10 int m, interval[maxn];
    11
    12 int main(){
    13 memset(interval, -1, sizeof(interval));
    14
    15 scanf("%d", &m);
    16 int tmpa, tmpb;
    17 while(scanf("%d%d", &tmpa, &tmpb)){
    18 if(tmpa==0 && tmpb==0) break;
    19 if(tmpb < 0 || tmpa >= m) continue;
    20 if(tmpa < 0) tmpa = 0;
    21 if(interval[tmpa] < tmpb)
    22 interval[tmpa] = tmpb;
    23 }
    24
    25 int cover=0, cur=0, i=0, imax = 0, num = 0;
    26 bool flag = 0;
    27 while(i<m){
    28 flag = 0;
    29 for(; i<=cover; i++){
    30 if(interval[i] > imax){
    31 imax = interval[i];
    32 cur = i;
    33 }
    34 }
    35 if(imax == cover) break;
    36
    37 cover = imax;
    38 num++;
    39 if(cover >= m){
    40 flag = 1;
    41 break;
    42 }
    43 }
    44
    45 if(flag) printf("%d\n", num);
    46 else printf("No solution\n");
    47
    48 return 0;
    49 }



     

      

  • 相关阅读:
    "alert(1) to win" writeup
    "CoolShell puzzle game" writeup
    Maximum Subarray(最大连续子序列和)
    hacking 学习站
    爬虫:备份人人网状态
    ichunqiu在线挑战--网站综合渗透实验 writeup
    ichunqiu在线挑战--我很简单,请不要欺负我 writeup
    IDF-CTF-简单的js加密 writeup
    IDF-CTF-cookie欺骗 writeup
    IDF-CTF-不难不易的js加密 writeup
  • 原文地址:https://www.cnblogs.com/longdouhzt/p/2199180.html
Copyright © 2011-2022 走看看