CF1714E Add Modulo 10#811(div.3)
题目链接
https://codeforces.com/problemset/problem/1714/E
题意简述
给你一个数组
你需要判断这个数组是否能经过任意次操作后所有元素都相同,能则输出"YES",否则输出"NO"
题外话:这大概是写的目前为止最长的一篇题解了..(虽然题目不是很难)
样例
点击查看样例
样例过长且意义不大,此题不再给出.请听下面分析
分析
样例1
对于数
对于数
所以是"YES"
样例2
对于数
对于数
对于数
可以看到无论进行多少次操作都不会相等,所以为"NO"
稍加思索我们可以发现,除了
并且我们发现进行一次
何为化简 ? 就是如
下面我们根据一个数
既然题目没有问到我们最少次数,我们就统一规定把结尾弄成以
下面所指的进位指的是数字末尾变化到 时,十位数字要增大几
对于末尾是
对于末尾是
对于末尾是
对于末尾是
对于末尾是
对于末尾是
对于末尾是
对于末尾是
对于末尾是
对于变化到
对于变化到
操作完后,如果所有数的位数(是个十百千的那个位数)均为1或者2,有解.如果有一位数有两位数,无解.那么只需排序,判断一下
对于数组中含有
① 如果数组中含有非
② 如果数组中所有数均为
至此,所有情况讨论完毕,代码献上
代码
点击查看代码
#include<stdio.h>
#include<iostream>
#include<cstdlib>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=2e5+10;
int a[N];
void solve(int &x)
{
switch(x%10)
{
case 1: x-=(x/20)*20;break;
case 2: x-=(x/20)*20;break;
case 3: x+=10;x-=(x/20)*20;break;
case 4: x-=(x/20)*20;break;
case 6: x+=10;x-=(x/20)*20;break;
case 7: x+=10;x-=(x/20)*20;break;
case 8: x-=(x/20)*20;break;
case 9: x+=10;x-=(x/20)*20;break;
}
}
int main()
{
//freopen("uva.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int f=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]%10==5||a[i]%10==0)f=1;
else solve(a[i]);
}
sort(a+1,a+n+1);
if(!f)
{
if(a[1]/10==0&&a[n]/10!=0)
{
printf("NO\n");
}
else printf("YES\n");
}
else
{
int f=1;
for(int i=1;i<=n;i++)
{
if(a[i]%5!=0)
{
f=0;
break;
}
if(i<n&&a[i]%10==0&&a[i+1]%10!=0)
{
f=0;
break;
}
}
if(a[n]-a[1]>5)f=0;
if(f)printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
附
网上看到一个更为简单的做法..ε=(´ο`*)))唉.蒟蒻什么时候也能和大佬们一样优秀
末尾是
对于 非
具体方法是:对数组
对最大值的每一步操作,都把他拿去和前面的
当然不需要真的对于每一个
代码如下
点击查看代码
#include <stdio.h>
#include <algorithm>
typedef long long LL;
const LL N = (LL)2e5 + 5, rep[] = {0, 2, 4, 8, 6}, srep[] = {0, 2, 6, 14};
LL n, a[N];
inline bool check(LL x) {
x %= 20;
for (LL i = 0; i < 4; ++i)
if (x == srep[i]) return true;
return false;
}
int main(void) {
LL t; for (scanf("%lld", &t); t--; ) {
scanf("%lld", &n); bool flag = false;
for (LL i = 1; i <= n; ++i) {
scanf("%lld", &a[i]);
if (a[i] % 5 == 0) flag = true; //是否存在 x % 5 == 0 的数 x
}
if (flag) {
bool ok = true;
for (LL i = 1; i <= n; ++i) {
if (a[i] % 10 == 5) a[i] += 5;
if (i != 1 && a[i] != a[i - 1]) {ok = false; break;}
}
puts(ok ? "Yes" : "No");
continue;
}
std:: sort(a + 1, a + 1 + n); //排序
for (LL i = 1; i <= n; ++i) //转末位为2
while (a[i] % 10 != 2) a[i] += a[i] % 10;
for (LL i = 0; i < 5; ++i) { //最大数末位循环
a[n] += rep[i]; flag = true;
for (LL j = 1; j < n; ++j)
if (!check(a[n] - a[j])) {flag = false; break;} //判断各数可行与否
if (flag) break;
}
puts(flag ? "Yes" : "No");
}
return 0;
}
/*
转自https://www.cnblogs.com/dry-ice/p/cf1714e.html
大佬nb~
/*
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】