- 描述
小A教室的牆上掛滿了氣球,五顏六色,小朋友們非常喜歡。
剛一下課,小朋友們就打算去搶這些氣球。每個氣球在牆上都有一定的高度,
只有當小朋友跳起來時,手能夠到的高度大於等於氣球的高度,小朋友才能摘到
這個氣球。為了公平起見,老師讓跳的低的小朋友先摘,跳的高的小朋友后摘。
小朋友都很貪心,每個小朋友在摘氣球的時候都會把自己能摘的氣球都摘掉。
很巧的是,小朋友們跳起來手能夠着的高度都不一樣,這樣就不會有跳起來
后高度相同的小朋友之間發生爭執了。
- 輸入
第一行輸入兩個空格分隔的整數n,m,其中n表示小朋友的數量,m表示牆上
氣球的數量。
第二行輸入n個正整數(每兩個整數之間用空格隔開),第i個數為 ai,表
示第i個小朋友跳起來手能夠着的高度為ai。
第三行輸入m個正整數(每兩個整數之間用空格隔開),第i個數為 hi,表
示第i個氣球的高度為hi。
- 輸出
輸出一共n行,每行一個整數。
第i行表示第i個小朋友摘到的氣球數量。
- 樣例輸入1
5 6
3 7 9 6 4
1 2 3 4 5 6
- 樣例輸出1
3
0
0
2
1
- 樣例輸入2
10 10
1 2 3 4 5 6 7 8 9 10
3 1 4 6 7 8 9 9 4 12 - 樣例輸出2
1 0 1 2 0 1 1 1 2 0
【題目分析】
首先把跳起高度和氣球高度都從小到大排序,然后用一個pos 來表示已經選到的氣球的位置。枚舉每個身高,如果滿足條件,pos 一直加,直到不滿足條件。
這樣人和氣球都只會掃描一遍。
標程如下
#include<bits/stdc++.h> using namespace std; template <typename T> inline void read(T &x) { x=0;int f=1;char c=getchar(); for(;c>'9'||c<'0';c=getchar()) if(c=='-') f=-1; for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48); x*=f; } template <typename T> inline void print(T x) { if(x<0) putchar('-'),x=-x; if(x>9) print(x/10); putchar(x%10+48); } long long dis[1010101]; struct ss{ int ID; long long A; }; ss s1[1010101]; long long h[1010101],n,m,tot; inline bool cmp(ss x,ss y) { return x.A<y.A; } int main() { // freopen("balloon.in","r",stdin); // freopen("balloon.out","w",stdout); read(n),read(m); for(register int i=1;i<=n;++i) read(s1[i].A),s1[i].ID=i; for(register int i=1;i<=m;++i) read(h[i]); stable_sort(h+1,h+1+m); stable_sort(s1+1,s1+1+n,cmp); int pos=0; for(register int i=1;i<=n;++i) { int sum=0; int W=s1[i].A; int ID=s1[i].ID; for(register int j=pos+1;j<=m;++j) { if(h[j]>W) break; else pos++,sum++; } dis[ID]=sum; } for(register int i=1;i<=n;++i) print(dis[i]),putchar('\n'); return 0; }