3272 小蓝的漆房

 将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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值