CF1992F Valuable Cards

题意分析

长度为n的序列ai,求将序列划分为最少数列的区间,这些区间的要求是区间内任意选出任意数的乘积不等于x。

求解思路

要让区间数列尽可能少,就得尽可能的多向右扩展,能加入当前区间就加,加不了再开新区间。

问题转为:新加入一个数y,这个区间的任意数的乘积是否会变成x。

对于y而言,y*sum=x,sum是要判断的区间内任意数的乘积,我们发现

  1. 只有y是x的约数,才能在乘以另一个数的时候变成x。也就是说,y如果不是x的约数,那么直接放进当前区间即可,不需要再作其他操作。
  2. 当y是x的约数时,就要看这个区间内是否有可能构成x的乘积存在了,这里如何判断呢?感觉是一个难点。

解决:把所有的约数记录下来,来一个ai,就与这一段区间内的数相乘,如果结果是x的约数,就把它记录下来,方便后面用,如果相乘的结果不是x的约数,那么直接不用管。

代码实现

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[100009],ans;
unordered_set<int>s,cur;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		s.clear();cur.clear();
		int n,x;
		ans=1;
		cin>>n>>x;
		for(int i=1;i<=n;i++)  cin>>a[i];
		
		for(int i=1;i<=n;i++)
		{
			if(x%a[i]!=0)  continue;
			for(auto j:s)//计算当前段中所有数*a[i] 
			{
				int k=a[i]*j;
				if(x%k==0)
				{
					if(k==x)
					{
						ans++;
						s.clear();
						cur.clear();
						break;
					}
					cur.insert(k);
				}
			}
			for(auto j:cur)
			{
				s.insert(j);	
			}
			cur.clear();
			if(x%a[i]==0)  s.insert(a[i]);			
		}
		cout<<ans<<endl;
	}
 } 

样例过了,但没有在cf测,突然上不了cf了,后面再测把,先发出来。

相关推荐
8Qi87 小时前
LeetCode 75:颜色分类(荷兰国旗问题)—— Java 题解 ✅
java·算法·leetcode·指针·排序
888CC++8 小时前
如何在 C 语言中进行程序调试?
前端·javascript·算法
(●—●)橘子……10 小时前
力扣第503场周赛练习理解
python·学习·算法·leetcode·职场和发展·周赛
明志数科11 小时前
4D时序标注技术详解:让机器人理解连续动作的数据基础
java·算法·机器人
KaMeidebaby12 小时前
卡梅德生物技术快报|原核表达系统工艺优化:包涵体重折叠 + 分子筛纯化实现功能 RBD 高效制备,附全参数配置
前端·人工智能·算法·数据挖掘·数据分析
无限码力12 小时前
携程0510笔试真题【单数组交换】
算法·携程笔试·携程笔试真题·携程0510笔试真题
BlockWay13 小时前
WEEX Labs 周度观察:微软-OpenAI 合作调整与AI 多云趋势
大数据·人工智能·算法·安全·microsoft
风筝在晴天搁浅13 小时前
快手 CodeTop LeetCode 224.基本计算器
数据结构·算法·leetcode
Smoothcloud润云13 小时前
5大功能精修,重构AI算力使用体验!
java·人工智能·windows·算法·重构·编辑器·sublime text