贪心_限制数字的范围的取模的技巧_偶数的性质_1883_C. Raspberries

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

const int N=2e5+10;

int a[N];

void solve()
{
	int n,k;
	cin>>n>>k;
	
	for(int i=0;i<n;i++)
		cin>>a[i];
	
	int ans=1e9;
	for(int i=0;i<n;i++)
	{
		if(a[i]%k==0)
			ans=0;
		int t=k-(a[i]+k)%k;
		ans=min(ans,t);
	}
	
	if(k==4)
	{
		int cnt=0;
		for(int i=0;i<n;i++)
			if(a[i]%2==0)
				cnt++;
		
		if(cnt>=2)
			ans=0;
		else if(cnt==1&&n-cnt>=1)
			ans=min(ans,1);
		else if(n-cnt>=2)
			ans=min(ans,2);
	}
	
	cout<<ans<<endl;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin>>t;
	
	while(t--)
		solve();
	
	return 0;
}

该题是一个一千分的动态规划和数学,虽然和我之前学的动态规划大相径庭

我感觉这题更像是一个贪心

首先是所有的数据都非常小,然后给的除数也是在一到五这个范围内,一根本不用考虑,因为一可以整除所有的正整数

剩下一个四和三个质数

四的话,需要另外考虑,两个偶数的乘积一定可以被四整除,因为偶数可以分解质因子出来一个二,两个偶数两个二,相乘就是四

对于另外几个除数,只需要考虑,一个数组元素经过最少多少次操作可以被该除数整除,贪心策略去一个最小值即可

下面这一行代码可以保证数组元素一定在除数的范围内,属于一个非常常见的技巧

cpp 复制代码
int t=k-(a[i]+k)%k;

偶数的个数大于二,并且除数是四的话,答案就是零,有一个偶数和不少于一个奇数,答案是用贪心策略和一取最小值,没有偶数,只有两个以上的奇数,答案是贪心策略和二取最小值

这个是div 3的第三个题,还是没有非常大的难度

相关推荐
散峰而望2 分钟前
C++数组(三)(算法竞赛)
开发语言·c++·算法·github
4***149015 分钟前
C++在系统中的编译优化
开发语言·c++
田姐姐tmner17 分钟前
Python切片
开发语言·python
oioihoii20 分钟前
C++程序执行起点不是main:颠覆你认知的真相
开发语言·c++
周杰伦fans1 小时前
C# 中的**享元工厂**模式
开发语言·数据库·c#
历程里程碑1 小时前
各种排序法大全
c语言·数据结构·笔记·算法·排序算法
u***u6851 小时前
C++在系统中的异常处理
java·开发语言·c++
树在风中摇曳1 小时前
带哨兵位的双向循环链表详解(含 C 代码)+ LeetCode138 深度解析 + 顺序表 vs 链表缓存机制对比(图解 CPU 层级)
c语言·链表·缓存
爱学测试的雨果1 小时前
收藏!软件测试面试题
开发语言·面试·职场和发展
安然无虞1 小时前
JMeter性能测试工具·下
开发语言·测试工具·jmeter