A38781题解
2026-08-14 17:22:59
发布于:浙江
5阅读
0回复
0点赞
背景:
原题链接
笑死我了,我一年半前打的巅峰赛,当时这道题我想了好久,交了好多次都没做对,代码还死长死乱,现在5分钟AC了。
笑点解析:
打比赛时的代码:
#include <iostream>
#include <algorithm>
using namespace std;
int a[10005];
int ans[10005];
int main(){
int n,k;
cin>>n>>k;
int v=1;
for (int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
if (a[1]!=0){
cout<<0;
return 0;
}else{
for(int i=1;i<=n;i++){
if (a[i]%k==0&&a[i]!=0){
ans[v]=a[i];
v++;
}
}
sort(ans+1,ans+v);
int j=1;
for (int i=1;i<v;i++){
if (ans[i]/k!=j){
cout<<ans[i-1]+k;
return 0;
}
j++;
}
cout<<ans[j-1]+k;
}
return 0;
}
分数:
我现在都看不懂那时我在干嘛,也没找出哪里错了。
思路:
把每个数都统计一下是否在数组中出现,然后开始枚举的倍数,发现在数组中没出现就是题目所求数组中未出现的 K 的最小倍数。
注意!!!是所有数的倍,也算的倍数,枚举时要把也算上去,不然只有。(别问我当时为什么和同学讨论半天都没想出来)
代码:
#include <iostream>
using namespace std;
int a[110];
bool f[110];//标记是否出现过
int main(){
int n,k;
cin>>n>>k;
for (int i=1;i<=n;i++){
cin>>a[i];
f[a[i]]=1;//表示a[i]在数组中出现过,标记为1
}
for (int i=0;;i+=k){//从0开始枚举!!!
if (f[i]==0){//如果没有出现(为0),就是题目所求
cout<<i;//输出
break;//结束循环
}
}
return 0;
}
结语:
希望对大家学习OI有帮助!
这里空空如也








有帮助,赞一个