0
点赞
收藏
分享

微信扫一扫

51nod 2510 顺子

時小白 2023-02-08 阅读 76


小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");
}

 

举报

相关推荐

0 条评论