1. 程式人生 > >考前模擬,qbxt十月底day1下午

考前模擬,qbxt十月底day1下午

水題(water)

Time Limit:1000ms Memory Limit:128MB
題目描述
LYK出了道水題。
這個水題是這樣的:有兩副牌,每副牌都有n張。
對於第一副牌的每張牌長和寬分別是xi和yi。對於第二副牌的每張牌長和寬分別是aj和bj。第一副牌的第i張牌能覆蓋第二副牌的第j張牌當且僅當xi>=aj並且yi>=bj。(注意牌不能翻轉)當然一張牌只能去覆蓋最多一張牌,而不能覆蓋好多張。
LYK想讓兩副牌的各n張 一 一 對應疊起來。它想知道第二副牌最多有幾張能被第一副牌所覆蓋。
輸入格式(water.in)
第一行一個數n。
接下來n行,每行兩個數xi,yi。
接下來n行,每行兩個數aj,bj。
輸出格式(water.out)
輸出一個數表示答案。
輸入樣例
3
2 3
5 7
6 8
4 1
2 5
3 4
輸出樣例
2
資料範圍
對於50%的資料n<=10。
對於80%的資料n<=1000。
對於100%的資料1<=n<=100000,1<=xi,yi,aj,bj<=10^9。

思路:

貪心====》貪的是最小浪費值,這樣找出來的也一定是最優解
把A,B兩類牌混在一起按xi值從小到大排序; 2*n
要求的是A類牌覆蓋B類牌
排序後搜一遍,後來者的x值是比前面的大的,
掃描時,遇到B類牌,把它的y值加入到另一個結構(一開始用的陣列代替,沒用multiset)中;
遇到A類牌時,就從構造結構中尋找B.y<=A(now).y來覆蓋(如此做到最小浪費),ans++; 並從結構中刪去已覆蓋的y值;如果結構中沒有比A.y小的數,那麼這張A牌就不能覆蓋;
考試時,沒接觸multiset,所以正確的想法,只得了60分;

#include<iostream>
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; const int maxn=100000+5; int n,Book[maxn],cnt,ans; inline int read() { int t=1,x=0; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') t=-1; ch=getchar();} while(ch>='0'
&&ch<='9'){ x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();} return t*x; } struct node { int x,y; bool p,vis; }poker[maxn<<1]; bool cmp(node a,node b) {return a.x<b.x;} int work(int ynow,int limit) { int now=0; for(int i=1;i<=cnt;i++) if((poker[Book[i]].vis==0)&&(poker[Book[i]].y<=ynow)) if(poker[Book[i]].y>poker[now].y) now=Book[i]; if(now) { poker[now].vis=1; poker[limit].vis=1; } } int main() { freopen("water.in","r",stdin); freopen("water.out","w",stdout); n=read(); for(int i=1;i<=n;i++) poker[i].x=read(),poker[i].y=read(),poker[i].p=0; for(int i=n+1;i<=2*n;i++) poker[i].x=read(),poker[i].y=read(),poker[i].p=1; sort(poker+1,poker+1+n+n,cmp); for(int i=1;i<=2*n;i++) { if(poker[i].p==1)//B牌 Book[++cnt]=i; if(poker[i].p==0)//A牌 work(poker[i].y,i); } for(int i=1;i<=2*n;i++) if((poker[i].vis)&&(!poker[i].p)) ans++; printf("%d",ans); }

用set優化後的

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<set>
using namespace std;
const int maxn=100000+5;
int n,cnt=1,ans;
multiset <int> s;
inline int read()
{
    int t=1,x=0;    char ch=getchar();
    while(ch<'0'||ch>'9'){ if(ch=='-') t=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}
    return t*x;
}
struct node
{
    int x,y;
    bool p;
}poker[maxn<<1];
bool cmp(node a,node b){
    if(a.x!=b.x) return a.x<b.x;
    else return a.p>b.p;//忘記 return wa一個點 
}
void work(int x)
{
    if(s.empty())   return ;
    multiset<int>::iterator it=s.upper_bound(poker[x].y);   
    if(it==s.begin()) return ;
    it--;
    ans++;
    s.erase(it);
}
int main()
{
    freopen("water.in","r",stdin);
    freopen("water.out","w",stdout);
    n=read();
    for(int i=1;i<=n;i++)   poker[i].x=read(),poker[i].y=read(),poker[i].p=0;
    for(int i=n+1;i<=2*n;i++)   poker[i].x=read(),poker[i].y=read(),poker[i].p=1;
    sort(poker+1,poker+1+n+n,cmp);
    for(int i=1;i<=2*n;i++)
    {
        if(poker[i].p==1) s.insert(poker[i].y); 
        if(poker[i].p==0) work(i);
    }
    printf("%d",ans);
    return 0;
}

夢境(dream)

Time Limit:1000ms Memory Limit:128MB
題目描述
LYK做了一個夢。
這個夢是這樣的,LYK是一個財主,有一個僕人在為LYK打工。
不幸的是,又到了月末,到了給僕人發工資的時間。但這個僕人很奇怪,它可能想要至少x塊錢,並且當LYK湊不出恰好x塊錢時,它不會找零錢給LYK。
LYK知道這個x一定是1~n之間的正整數。當然摳門的LYK只想付給它的僕人恰好x塊錢。但LYK只有若干的金幣,每個金幣都價值一定數量的錢(注意任意兩枚金幣所代表的錢一定是不同的,且這個錢的個數一定是正整數)。LYK想帶最少的金幣,使得對於任意x,都能恰好拼出這麼多錢。並且LYK想知道有多少攜帶金幣的方案總數。
具體可以看樣例。
輸入格式(dream.in)
第一行一個數n,如題意所示。
輸出格式(dream.out)
輸出兩個數,第一個數表示LYK至少攜帶的金幣個數,第二數表示方案總數。
輸入樣例
6
輸出樣例
3 2
樣例解釋
LYK需要至少帶3枚金幣,有兩種方案,分別是{1,2,3},{1,2,4}來恰好得到任意的1~n之間的x。
輸入樣例2
10
輸出樣例2
4 8
資料範圍
對於30%的資料n<=10。
對於60%的資料n<=100。
對於100%的資料n<=1000。

動態規劃(dp)

Time Limit:2000ms Memory Limit:128MB
題目描述
LYK在學習dp,有一天它看到了一道關於dp的題目。
這個題目是這個樣子的:一開始有n個數,一段區間的價值為這段區間相同的數的對數。我們想把這n個數切成恰好k段區間。之後這n個數的價值為這k段區間的價值和。我們想讓最終這n個數的價值和儘可能少。
例如6個數1,1,2,2,3,3要切成3段,一個好方法是切成[1],[1,2],[2,3,3],這樣只有第三個區間有1的價值。因此這6個數的價值為1。
LYK並不會做,丟給了你。
輸入格式(dp.in)
第一行兩個數n,k。
接下來一行n個數ai表示這n個數。
輸出格式(dp.out)
一個數表示答案。
輸入樣例
10 2
1 2 1 2 1 2 1 2 1 2
輸出樣例
8
資料範圍
對於30%的資料n<=10。
對於60%的資料n<=1000。
對於100%的資料1<=n<=100000,1<=k<=min(n,20),1<=ai<=n。
其中有30%的資料滿足ai完全相同均勻分佈在所有資料中。