顺子(51Nod-2510)
生活随笔
收集整理的這篇文章主要介紹了
顺子(51Nod-2510)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目
小b有n張牌。?
現(xiàn)在她想把牌分組,使得每組都是長度為W的順子,即由連續(xù)W個(gè)數(shù)組成。
請問小b能做到嗎?
輸入
第一行輸入一個(gè)數(shù)n,表示手牌張數(shù);
第二行輸入n個(gè)非負(fù)整數(shù),表示每張牌的數(shù)字,以空格隔開;
第三行輸入一個(gè)數(shù),表示每組大小W;
其中1≤W≤n≤10000,任意牌的數(shù)字hand[i]滿足0≤hand[i]≤10^9
輸出
可以分組,輸出“true”;
不能分組,輸出“false”。
輸入樣例
9
1 2 3 6 2 3 4 7 8
3
輸出樣例
true
思路:桶排的基本應(yīng)用,需要注意的是,由于 a[i] 最大可能到 1E9,數(shù)組開不了那么大,因此需要使用 map 來進(jìn)行桶排
源程序
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long const int MOD = 1E9+7; const int N = 4000000+5; const int dx[] = {0,0,-1,1,-1,-1,1,1}; const int dy[] = {-1,1,0,0,-1,1,-1,1}; using namespace std;LL a[N]; //int bucket[N]; map<LL,int> bucket; int main() {int n,w;scanf("%d",&n);for(int i=1; i<=n; i++) {scanf("%lld",&a[i]);bucket[a[i]]++;}scanf("%d",&w);if(w==1)printf("true\n");else if(n%w!=0)printf("false\n");else{sort(a+1,a+n+1);int num=w;bool flag=false;for(int i=1; i<=n; i++) {if(bucket[a[i]]==0)continue;for(int j=0; j<w; j++) {if(bucket[a[i]+j]!=0)bucket[a[i]+j]--;else {flag=true;break;}}if(flag)break;}if(flag)printf("false\n");elseprintf("true\n");}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的顺子(51Nod-2510)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 和为k的连续区间(51Nod-1094)
- 下一篇: 信息学奥赛一本通(1056:点和正方形的