Codeforces Round #565 (Div. 3)
A. Divide it!
•题意
定义整数 n 上的三个操作:
如果可以经过上述操作使得 n 变为 1,输出最小操作次数,反之,输出-1;
•题解
易得 2 > 3/2 > 5/4;
操作执行的优先级 1 > 2 > 3;
按照优先级依次执行;
•AC代码
View Code
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 5 ll n; 6 int Solve() 7 { 8 int ans=0; 9 while(n%2 == 0) 10 { 11 n /= 2; 12 ans++; 13 } 14 while(n%3 == 0) 15 { 16 n /= 3; 17 ans += 2; 18 } 19 while(n%5 == 0) 20 { 21 n /= 5; 22 ans += 3; 23 } 24 return n == 1 ? ans:-1; 25 } 26 int main() 27 { 28 int test; 29 scanf("%d",&test); 30 while(test--) 31 { 32 scanf("%lld",&n); 33 printf("%d ",Solve()); 34 } 35 return 0; 36 }
B. Merge it!
•题意
给你一个包含 n 个数的序列 a;
定义序列 a 上的一个操作:合并任意两个元素;
你可以对序列 a 执行上述操作任意次,求操作后的序列最多有多少元素可以被 3 整除;
•题解
对于任意一个数 x ,如果 x 不是 3 的倍数,那么 x 最多加 2 就可以变成 3 的倍数;
首先求出 ai 最少加多少可以变成 3 的倍数;
共有三种可能:
①如果 ai%3 = 0,加0;
②ai%3 = 1,加2;
③ai%3 = 2,加1;
②和③结合正好是3的倍数,优先让②和③结合,剩余的自己结合;
•AC代码
View Code
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define INF 0x3f3f3f3f 5 #define mem(a,b) memset(a,b,sizeof(a)) 6 #define memF(a,b,n) for(int i=0;i<=n;a[i++]=b); 7 const int maxn=1e2+50; 8 9 int n; 10 int a[maxn]; 11 int b[3]; 12 13 int Solve() 14 { 15 b[0]=b[1]=b[2]=0; 16 for(int i=1;i <= n;++i) 17 { 18 int k=a[i]%3; 19 if(k == 0) 20 b[0]++; 21 else if(k == 1) 22 b[2]++; 23 else 24 b[1]++; 25 } 26 27 return b[0]+min(b[1],b[2])+abs(b[2]-b[1])/3; 28 } 29 int main() 30 { 31 // freopen("C:\Users\hyacinthLJP\Desktop\in&&out\contest","r",stdin); 32 int test; 33 scanf("%d",&test); 34 while(test--) 35 { 36 scanf("%d",&n); 37 for(int i=1;i <= n;++i) 38 scanf("%d",a+i); 39 printf("%d ",Solve()); 40 } 41 return 0; 42 }