开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
B - Coloring
题意:一共有n个格子,m种颜色,每种颜色必须要用a[i]次且连续的k个格子不能出现相同的颜色,问有没有一种涂色的方法可以满足上面所说的条件
思路:真是做题变少了之后变得越来越垃圾了,这种题也想不出来了,首先可以发现k这个东西可以把n个格子分成块,然后可以发现如果a[i]<=n/k那么是一定符合条件的,插进去就可以,不用担心会有冲突啥的,根本不会有冲突,因为a[1]+a[2]+,,,+a[m]=n,所以不会有多出来的情况,唯一需要考虑的就是maxx=max(a[1],,,a[m])大于等于n/k+1的情况了,如果大于那么直接不行,如果等于的话还需要看看maxx会有几个,如果maxx的数量大于n%k了就说明多出来的a[i]一定会与其他的重复了,所以符合条件的只有两种情况,一种是maxx<=n/k,另一种就是maxx==n/k+1且mp[maxx]<=n%k,mp是出现的次数,即要么最大的数小于等于n/k,要么最大的数等于n/k+1且不能超过n%k;代码很简单,统计一下次数分类讨论就行
#include<bits/stdc++.h>
//#pragma-GCC-optimize("-Ofast");
#define ll long long
#define int long long
#define lowbit(x) ((x)&(-x))
#define endl '\n'
using namespace std;
const ll mod=998244353;
const ll inf=1e18;
const double pi=acos(-1);
const int N=1e6+100;
ll qpow(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
ll getinv(ll a){return qpow(a,mod-2);}
int t,n,m,k,a[N];
map<int,int>mp;
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n>>m>>k;
int maxx=0;mp.clear();
for(int i=1;i<=m;i++) cin>>a[i],maxx=max(maxx,a[i]),mp[a[i]]++;
if(maxx<=n/k) cout<<"YES\n";
else if(maxx==n/k+1&&mp[maxx]<=n%k) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}