2 条题解

  • 2
    @ 2022-7-5 11:18:45

    题目描述

    小学生的高桥君很喜欢条纹图案. 现在, 高桥正在眺望从左到右排列在一条直线上的 nn 张彩色图画纸. 高桥非常喜欢条纹图案, 所以想通过用颜料把一些图画纸涂成新的颜色, 使其从整体上看是条纹图案.

    从整体上看是条纹图案是指全部图画纸使用的颜色正好为 2 种, 且所有的图画纸的颜色与其相邻的图画纸不同.

    你的任务是, 在给定已经配置好的图画纸的张数 nn 和把 1 张图画纸换成其他颜色所需的颜料的费用 cc 的基础上, 编制一个程序来输出达成条纹图案所需的总费用的最小值. 为了简化问题,图画纸上的每种颜色都是以 1 ~ 10 中的整数形式给出的. 可以用来重凃的颜料的颜色也只有这 10 种.

    思路

    题目中指出“条纹”,即“121212”或“010”这样的相邻两个数不相等,而且对于这个数列里的数,a[i]=a[i+2]。 那这里要判断,这条纹里的“颜色”需要哪两种。 所以,就有以下“贪心”策略: 枚举“条纹”里的奇数项,找到出现频率最高的颜色,将其他颜色转为这个颜色,偶数项也一样。 但这里有一个特例,即奇数项出现频率最高的与偶数项出现频率最高的相等,即样例二“1 1 1 1”,这样的话,答案就错了,所以,我们在判断偶数时,就需要特判。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int a[50000],cnt[30];
    int main() {
    	int n,m,s1=0,maxn=0,ans=0,maxk=0;
    	cin>>n>>m;
    	for(int i=1; i<=n; i++) cin>>a[i];
    	for(int i=1; i<=n; i+=2) cnt[a[i]]++,s1++; //奇数项的数用桶装起来,判断出现频率
    	for(int i=1; i<=10; i++)
    		if(maxn<cnt[i]) maxn=cnt[i],maxk=i;//找出最大值
    
    	ans=s1-maxn;//判断需要染几个数
    	maxn=0;
    	memset(cnt,0,sizeof(cnt));
    	for(int i=2; i<=n; i+=2) cnt[a[i]]++;	//偶数项的数用桶装起来,判断出现频率
    	for(int i=1; i<=10; i++) {
    		if(i!=maxk)//判断是否与奇数项最高频率数相同
    			if(maxn<cnt[i])
    				maxn=cnt[i];
    	}
    	ans+=n-s1-maxn;//判断需要染几个数
    	cout<<ans*m;//输出,记得乘m
    	return 0;
    }
    
    • 1
      @ 2022-7-15 10:08:31

      暴力

      #include <bits/stdc++.h>
      using namespace std;
      const int N = 1e5 + 5;
      int a[N], n, m, ans = 1919810;
      int main() {
      	cin >> n >> m;
      	for (int i = 1; i <= n; i ++)
      		cin >> a[i];
      	for (int i = 1; i <= 10; i ++)
      		for (int j = 1; j <= 10; j ++)
      			if (i != j) {
      				int sum = 0;
      				for (int k = 1; k <= n; k ++)
      					if (a[k] != (k % 2 ? i : j))
      						sum += m;
      				ans = min(ans, sum);
      			}
      	cout << ans << '\n';
      	return 0;
      }
      
      • 1

      信息

      ID
      125
      时间
      1000ms
      内存
      256MiB
      难度
      4
      标签
      递交数
      28
      已通过
      16
      上传者