本文主要是介绍51nod 2510 顺子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
小b有n张牌。
现在她想把牌分组,使得每组都是长度为W的顺子,即由连续W个数组成。
请问小b能做到吗?
收起
输入
第一行输入一个数n,表示手牌张数; 第二行输入n个非负整数,表示每张牌的数字,以空格隔开; 第三行输入一个数,表示每组大小W; 其中1≤W≤n≤10000,任意牌的数字hand[i]满足0≤hand[i]≤10^9
输出
可以分组,输出“true”; 不能分组,输出“false”。
输入样例
9 1 2 3 6 2 3 4 7 8 3
输出样例
true
分析:
这是今天晚上还比较好的一道题,但51nod二级题的暴力惊讶到了,瞬间对其失去了兴趣。
用map和排序做的,一看代码就懂,其实也很水,就是一开始题意读错了,wA好几法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10005;
ll a[N];
map<ll,int> mp;
int main()
{int n,w;scanf("%d",&n);for(int i=1;i<=n;i++){ scanf("%lld",&a[i]);mp[a[i]]++;}scanf("%d",&w);if(w==1) {printf("true\n");return 0;}if(n%w!=0) {printf("false\n");return 0;}sort(a+1,a+n+1);int flag=0;int num=w;for(int i=1;i<=n;i++){if(mp[a[i]]==0) continue;//cout<<a[i]<<endl;//cout<<mp[a[i]]<<" "<<mp[a[i]+1]<<" "<<mp[a[i]+2]<<endl;for(int j=0;j<w;j++){//cout<<a[i]+j<<endl;if(mp[a[i]+j]!=0){mp[a[i]+j]--;}else{flag=1;break;}}if(flag==1) break;}if(flag==1) printf("false\n");else printf("true\n");
}
这篇关于51nod 2510 顺子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!