将devc++设置支持编译就能用新的遍历方式
for(auto &x : s)//遍历容器s,变量为x
/*
多循环的嵌套:
计数是否需要重置为0;
是否因为ans定义成全局变量导致ans在比较多时候会出现错误
*/
/*
1.对于一个标准色,对目标数组遍历,
如果和标准相同检查下一个,
否则将当前元素在内的K个元素一起“涂成”标准色,
表现为cnt++。
2.标准色的获取:用无序数组unorder_set进行存储,然后可以用auto进行遍历
(这里遍历的顺序是不知道的)
*/
#include <bits/stdc++.h>
using namespace std;
//思想:每次只是操作一个数
//确定涂房子的标准(哪个数)
int main() {
int t; cin >> t;
for (int i = 0, n, k; i < t; i++) {
cin >> n >> k;
vector<int> arr(n);
unordered_set<int> s;
for (int j = 0; j < n; j++) {
cin >> arr[j];
s.insert(arr[j]); //一个集合,防止重复记录
}
int ans = INT_MAX;
for (unordered_set<int>::iterator it = s.begin(); it != s.end(); ++it) {
int cnt = 0; // 计数器,用于记录需要操作的次数
// 遍历数组arr
for (int j = 0; j < n; j++) {
if (arr[j] == *it) continue; // 如果当前元素与集合中的元素相同,则跳过
cnt++; // 否则,计数器加1
j =j + k - 1; // 跳过接下来的k-1个元素
}
ans = min(ans, cnt); // 更新答案为当前最小的操作次数
}
//两个循环的意思:
//对于集合中每一个元素都要进行判断
cout << ans << endl;
}
return 0;
}
我的代码:
还有一些问题,左边能过,右边过不了
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;
while(t--)
{
int n,k;cin>>n>>k;
vector<int> arr(n);
unordered_set<int> s;
for(int i=0;i<n;i++)
{
cin>>arr[i];
s.insert(arr[i]);
}
int ans=INT_MAX;//因为是标准色之间的比较,所以ans定义在外面
for(auto &x : s)
{
int cnt=0;
for(int j=0;j<n;j++)
{
if(arr[j]==x) continue;
cnt++;
j+=k-1;
}
ans=min(ans,cnt);
}
cout<<ans<<'\n';
}
return 0;
}
这样就可以了。
将动态数组的长度开为n+1
这样下标就能到n了。
如果长度是n那么下标只能到n-1
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;cin>>t;
while(t--)
{
int n,k;cin>>n>>k;
vector<int> arr(n+1);
unordered_set<int> s;
for(int i=1;i<=n;i++)
{
cin>>arr[i];
s.insert(arr[i]);
}
int ans=INT_MAX;
for(auto &x : s)
{
int cnt=0;
for(int j=1;j<=n;j++)
{
if(arr[j]==x) continue;
cnt++;
j+=k-1;
}
ans=min(ans,cnt);
}
cout<<ans<<'\n';
}
return 0;
}