1. 程式人生 > >HDU 6249

HDU 6249

total different app follow there must ron 競賽 alice

Alice’s Stamps

Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 125 Accepted Submission(s): 34


Problem Description Alice likes to collect stamps. She is now at the post office buying some new stamps.
There are N different kinds of stamps that exist in the world; they are numbered 1
through N. However, stamps are not sold individually; they must be purchased in sets. There are M different stamp sets available; the ith set contains the stamps numbered Li through Ri. The same stamp might appear in more than one set, and it is possible that one or more stamps are not available in any of the sets.
All of the sets cost the same amount; because Alice has a limited budget, she can buy at most K different sets. What is the maximum number of different kinds of stamps that Alice can get?

Input The input starts with one line containing one integer T, the number of test cases.T test cases follow.
Each test case begins with a line containing three integers: N, M, and K: the number of different kinds of stamps available, the number of stamp sets available, and the maximum number of stamp sets that Alice can buy.
M lines follow; the ithoftheselinesrepresentsthei^{th} stamp set and contains two integers, Li and Ri, which represent the inclusive range of the numbers of the stamps available in that set.
1T100
1KM
1N,M2000
1LiRiN

Output For each test case, output one line containing “Case #x: y”, where x is the test case number (starting from 1) and y is the maximum number of different kinds of stamp that Alice could get.

Sample Input 2 5 3 2 3 4 1 1 1 3 100 2 1 1 50 90 100

Sample Output Case #1: 4 Case #2: 50 Hint In sample case #1, Alice could buy the first and the third stamp sets, which contain the first four kinds of stamp. Note that she gets two copies of stamp 3, but only the number of different kinds of stamps matters, not the number of stamps of each kind. In sample case #2, Alice could buy the first stamp set, which contains 50 different kinds of stamps.

Source 2017中國大學生程序設計競賽-總決賽-重現賽(感謝哈工大)

題意:

有n種卡片1~n,m個卡包,每個卡包中包含一段連續的不重復的卡片,wen最多買k個卡包能夠得到的最多的種類的卡片。

代碼:

//n和k只有2000,可以用nk的方法,f[i][j]表示到達i位置使用了j個卡包的最大卡片種類數,先處理出來如果買了i卡片能夠買到的左邊的最遠的那
//個卡片lef[i],這樣就可以轉移了,到達i位置考慮買還是不買,不買就由前一個轉移,買就由lef[i]轉移來。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int t,n,m,k,f[2009][2009],lef[2009];
int main()
{
    scanf("%d",&t);
    for(int cas=1;cas<=t;cas++){
        memset(f,0,sizeof(f));
        memset(lef,INF,sizeof(lef));
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=m;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            for(int j=x;j<=y;j++) lef[j]=min(lef[j],x);
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=k;j++){
                if(lef[i]==INF){
                    f[i][j]=f[i-1][j];
                    continue;
                }
                int tmp=lef[i]-1;
                f[i][j]=max(f[i-1][j],f[tmp][j-1]+(i-tmp));
                ans=max(ans,f[i][j]);
            }
        }
        printf("Case #%d: %d\n",cas,ans);
    }
    return 0;
}

HDU 6249