样例可过WA0

题目:


最新代码:

#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi  0
I AK IOI;
int t,n,k;
int main(){
	//freopen("","r",stdin);
	//freopen("","w",stdout);
	cin>>t;
	while(t--){
		int a[10005],sum[10005],s=INT_MAX,id,l,r,ans,num=0;
		bool flag[105];
		memset(flag,0,sizeof flag);
		cin>>n>>k;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			if(!flag[a[i]])sum[++num]=a[i],flag[a[i]]=1;
		}
		for(int j=1;j<=num;j++){
			ans=0,l=0,r=0;
			for(int i=1;i<=n;i++){
				if(!l&&a[i]!=sum[j])l=i;
				if(l&&a[i]==sum[j])r=i;
				if(l&&r){
					int cnt=r-l;
					ans+=ceil(cnt*1.0/k);
					l=0,r=0;
				}
			}
			if(l&&!r)ans+=ceil((n-l+1)*1.0/k);
			s=min(s,ans);
		}
		cout<<s<<endl;
	}
	i_ak ioi;
}
1 个赞

@2345安全卫士

现成的解决方案~

感觉可能额是思路错了?还是代码实现有问题?

?能帮我调一下吗 qwq

嗯。

1 个赞

给个你的思路?

1 个赞

@2345安全卫士 那我的思路哪里错了?

不是,我就说你的思路是什么?

1 个赞

@2345安全卫士 我现在告诉你

我的思路是:

首先求出出现次数最多的数,将所有的数都变成这种数,每次求出一个不被这种数组成的区间,想要改编成这个数的步数就是 ceil(cnt*1.0 /k) 其中 cnt 是这个区间的长度 @2345安全卫士

1 个赞

不一定啊

1 个赞

我给你hack掉:

13 2
2 2 2 3 3 3 3 3 1 1 1 2 2

1 个赞

输出什么?

稍等

1 个赞

我调一下

12 2
2 2 2 3 3 3 3 1 1 1 3 2

用这个,应该输出 4,

最多的是:3
3的个数:5( [A_1,A_2],[A_3],[A_8,A_9],[A_{10}],[A_{12}]
2的个数:4( [A_4,A_5],[A_6,A_7],[A_8,A_9],[A_{10},A_{11}]

@王钰宸涵

1 个赞

@2345安全卫士 o谢谢

1 个赞

看一眼我的样例解释,可以帮调

1 个赞

帮你跳到某某讨论区了,因为常规区5次回【数据删除】

1 个赞