Codeforces Round #811 (Div. 3) E. Add Modulo 10(数学)
https://codeforces.com/contest/1714/problem/E
给你一个n个整数的数组a1,a2,…,an
您可以任意多次应用以下操作:
选择一个索引i (1≤i≤n)并用值ai+(ai mod 10)替换元素ai的值,其中ai mod 10是整数ai除以10的余数。
对于单个索引(值I),该操作可以应用多次。如果操作重复应用于相同的索引,则每次都考虑ai的当前值。例如,如果ai=47,那么在第一次运算之后,我们得到ai=47+7=54,在第二次运算之后,我们得到ai=54+4=58。
检查是否有可能通过应用多个(可能是零个)运算使所有数组元素相等。
input
10
2
6 11
3
2 18 22
5
5 10 5 10 5
4
1 2 4 8
2
4 5
3
93 96 102
2
40 6
2
50 30
2
22 44
2
1 5
output
Yes
No
Yes
Yes
No
Yes
No
No
Yes
No
-
这个题目可以通过模拟数据得到
个数是5的时候只能加1次5,从而得到它的最大值
个数是0的时候它自己就是最大值了
所以0和5在一起讨论
这是第一类 -
当个数是1的时候,1 2 4 8 6 (2 4 8 6)依次循环
当个数是3的时候3 6 2 4 8 (6 2 4 8)依次循环
当个数是7的时候7 4 8 6 2(4 8 6 2)依次循环
当个数是9的时候9 8 6 2 4 (8 6 2 4)依次循环 -
可以看到除了0和5之外的这些,他们都可以走上2 4 8 6的循环道路
这样我们只需要把它们通通统一变成2 4 8 6其中一个个数就行啦,为了最小的时间复杂度
我们可以把他们都变成以2为个数的数
这就是第二类 -
需要注意的是2 22之间才能变化,因为中间需要留有一个位置给6变换,所以之间的余数必须是20的倍数
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=500500;
int a[N];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int T=1;
cin>>T;
while(T--)
{
int n;
cin>>n;
map<int,int> mp;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]%10==5) a[i]+=5;
mp[a[i]%10]++;
if(a[i]%10!=5&&a[i]%10!=0)
{
while(a[i]%10!=2)
{
a[i]+=a[i]%10;
}
}
}
sort(a+1,a+1+n);
if(mp[0]==n)
{
if(a[1]==a[n]) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else
{
bool flag=true;
for(int i=1;i<n;i++)
{
if((a[i+1]-a[i])%20!=0)
{
flag=false;
break;
}
}
if(flag==true) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
return 0;
}
这题真的可惜,昨晚给我写假了,还没改出来
【傻狗哭泣】