题解 CF1401C 【Mere Array】
这题是一道小思维题,放在 C 的话难度还是比较低的。
我看有些题解只给了做法没有给证明,所以来说一下。
题意是说如果两个数最大公约数是序列最小值就可以交换。问最小交换次数使得单调不下降。
先给结论:我们先对 数组排序,得到最终数列。考虑每个数,如果这个数不等于最终数列的数并且不能被数列最小值整除,那么输出 NO
。否则遍历完后输出 YES
。
为什么呢?可以先考虑如果一个数不能被数列最小值整除,那么它肯定无法做任何交换,那么如果还不等于最终数列的数,那肯定是不行的。
如果这个数就等于最终数列的数,保留即可。
如果这个数可以整除数列最小值,那么对于两个满足此条件的数(设为 和 ),可以和最小值 进行如下操作:
x y z
x z y
z x y
y x z
可以发现,最小值的位置没有改变,而 与 的位置进行了交换。所以对于所有这样的数,两两可以交换(间接交换)。那么肯定可以达到目标。
其实如果这两个数里有一个数是最小值,那么直接交换即可。依旧是满足的。
所以结论成立。
#include<bits/stdc++.h>
using namespace std;
int a[100001],b[100001];
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
for (int i=1;i<=n;i++)
{
cin >> a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
for (int i=1;i<=n;i++)
{
if (a[i]!=b[i]&&a[i]%b[1]!=0)
{
cout << "NO" << endl;
goto no;
}
}
cout << "YES" << endl;
no:;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构