当前位置:   article > 正文

Codeforces Round 925 (Div. 3) A - E 题解_recovering a small string

recovering a small string

A. Recovering a Small String

题意:问给你一个n,找到字符串序列最小的三个字母。
题解:贪心即可。
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std ;
  3. typedef long long ll ;
  4. const int maxn = 2e5 + 7 ;
  5. inline ll read(){
  6. ll x = 0 , f = 1 ;
  7. char c = getchar() ;
  8. while(c > '9' || c < '0'){
  9. if(c == '-')
  10. f = -1 ;
  11. c = getchar() ;
  12. }
  13. while(c >= '0' && c <= '9'){
  14. x = x * 10 + c - '0' ;
  15. c = getchar() ;
  16. }
  17. return x * f ;
  18. }
  19. ll t , n , m , k , a[maxn] , c[maxn] , b[maxn] ;
  20. char s[maxn] ;
  21. void solve(){
  22. n = read() ;
  23. ll x = 3 ;
  24. c[1] = 1 ;
  25. c[2] = 1 ;
  26. c[3] = 1 ;
  27. if(x + 25 <= n){
  28. c[3] = 26 ;
  29. x += 25 ;
  30. }
  31. else{
  32. cout << char(c[1] + 'a' - 1) << char(c[2] + 'a' - 1) << char(c[3] + (n - x) + 'a' - 1) << endl ;
  33. return ;
  34. }
  35. if(x + 25 <= n){
  36. c[2] = 26 ;
  37. x += 25 ;
  38. }
  39. else{
  40. cout << char(c[1] + 'a' - 1) << char(c[2] + (n - x) + 'a' - 1) << char(c[3] + 'a' - 1) << endl ;
  41. return ;
  42. }
  43. cout << char(c[1] + (n - x) + 'a' - 1) << char(c[2] + 'a' - 1) << char(c[3] + 'a' - 1) << endl ;
  44. }
  45. int main(){
  46. t = read() ;
  47. while(t --){
  48. solve() ;
  49. }
  50. return 0 ;
  51. }

B. Make Equal

题意:给你n个数字,n个数字求和一定会被n整除,可以操作(1 <= i < j <= n)并且使a_i - 1 , a_j + 1。看看能否将所有数字变成一样的。
题解:贪心即可,如果数字大于sum / n ,那么就累计,如果数字小于sum / n , 那么就看看累计的数字能不能填补即可,如果不行输出NO。
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std ;
  3. typedef long long ll ;
  4. const int maxn = 2e5 + 7 ;
  5. inline ll read(){
  6. ll x = 0 , f = 1 ;
  7. char c = getchar() ;
  8. while(c > '9' || c < '0'){
  9. if(c == '-')
  10. f = -1 ;
  11. c = getchar() ;
  12. }
  13. while(c >= '0' && c <= '9'){
  14. x = x * 10 + c - '0' ;
  15. c = getchar() ;
  16. }
  17. return x * f ;
  18. }
  19. ll t , n , m , k , a[maxn] , c[maxn] , b[maxn] ;
  20. char s[maxn] ;
  21. void solve(){
  22. n = read() ;
  23. ll sum = 0 ;
  24. for(int i = 1 ; i <= n ; i ++){
  25. a[i] = read() ;
  26. sum += a[i] ;
  27. }
  28. sum /= n ;
  29. ll res = 0 ;
  30. for(int i = 1 ; i <= n ; i ++){
  31. if(a[i] < sum){
  32. if((sum - a[i]) > res){
  33. cout << "NO\n" ;
  34. return ;
  35. }
  36. else{
  37. res -= (sum - a[i]) ;
  38. }
  39. }
  40. else{
  41. res += (a[i] - sum) ;
  42. }
  43. }
  44. cout << "YES\n" ;
  45. }
  46. int main(){
  47. t = read() ;
  48. while(t --){
  49. solve() ;
  50. }
  51. return 0 ;
  52. }

C. Make Equal Again

题意:给你n个数字,看看能不能找到(1 <= i < j <= n)并且覆盖此区间为x,只能进行一次操作,问最小的(j - i + 1)是多少。
题解:很明显,必须要从开头和结尾算起,找到从开头开始的相同序列的最长长度,找到从结尾开始的相同序列的最长长度,分别统计取max即可,详细细节请见代码。
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std ;
  3. typedef long long ll ;
  4. const int maxn = 2e5 + 7 ;
  5. inline ll read(){
  6. ll x = 0 , f = 1 ;
  7. char c = getchar() ;
  8. while(c > '9' || c < '0'){
  9. if(c == '-')
  10. f = -1 ;
  11. c = getchar() ;
  12. }
  13. while(c >= '0' && c <= '9'){
  14. x = x * 10 + c - '0' ;
  15. c = getchar() ;
  16. }
  17. return x * f ;
  18. }
  19. ll t , n , m , k , a[maxn] , c[maxn] , b[maxn] ;
  20. char s[maxn] ;
  21. void solve(){
  22. n = read() ;
  23. for(int i = 1 ; i <= n ; i ++){
  24. a[i] = read() ;
  25. }
  26. ll rt = n , Rt = 1 ;
  27. ll res = a[1] ;
  28. for(int i = 2 ; i <= n ; i ++){
  29. if(a[i] != res){
  30. rt = i - 1 ;
  31. break ;
  32. }
  33. }
  34. res = a[n] ;
  35. for(int i = n - 1 ; i >= 1 ; i --){
  36. if(res != a[i]){
  37. Rt = i + 1 ;
  38. break ;
  39. }
  40. }
  41. if(a[1] == a[n]){
  42. if(Rt <= rt){
  43. cout << 0 << endl ;
  44. return ;
  45. }
  46. cout << n - rt - (n - Rt + 1) << endl ;
  47. return ;
  48. }
  49. else{
  50. cout << n - max((n - Rt + 1) , rt) << endl ;
  51. return ;
  52. }
  53. }
  54. int main(){
  55. t = read() ;
  56. while(t --){
  57. solve() ;
  58. }
  59. return 0 ;
  60. }

D. Divisible Pairs

题意:给你n个数字还有一个x一个y,看能找到多少对(1 <= i < j <= n)(a_i + a_j)可以整除x并且(a_i - a_j)可以整除y。
题解:这是一个关于同余的问题,存入模数,用map统计即可,需要用到少许组合数知识。
代码:
  1. void result() {
  2. cin >> n >> x >> y;
  3. map<int, vector< int > > mod_y;
  4. for (int i = 0; i < n ; i ++) {
  5. cin >> a[i] ;
  6. mod_y[a[i] % y].push_back(a[i] % x);
  7. }
  8. ll ans{} ;
  9. for (auto it : mod_y) {
  10. ll sum{} ;
  11. map< int , ll > cnt ;
  12. for (int i = it.S.size() - 1 ; i >= 0 ; i --) {
  13. if (it.S[i] == 0) {
  14. sum += (cnt[0]) ;
  15. }
  16. sum += (cnt[x - it.S[i]]) ;
  17. cnt[it.S[i]] ++ ;
  18. }
  19. ans += sum ;
  20. }
  21. cout << ans ;
  22. }

E. Anna and the Valentine's Day Gift

题意:给你n个数字和一个数字m,有两个人,Anna和Sasha,Anna先操作,它会将一个数字的顺序逆转,Sasha的操作会挑选两个数字,将他们拼接起来,顺序随便。两个人的操作都是最佳操作,问最后剩下的数字如果小等于10的m次方,那么就是Anna赢,否则Sasha赢。
题解:看到这个题,很明显,要比较数字位数,那么就能想到如果一个数字后面有0,那么Anna操作会让0全部消失,那么就很明显了,这道题转换成了最多会减少多少个0,那么就很简单了,将所有数字的末尾0个数统计到优先队列里面,从大里面开始取,Anna操作就减去队顶的0的个数,Sasha操作就是可以保住队顶的0的个数,最后用总共的数字位数x -一共减去的0的个数和m + 1进行比较判断即可。
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std ;
  3. typedef long long ll ;
  4. const int maxn = 2e5 + 7 ;
  5. inline ll read(){
  6. ll x = 0 , f = 1 ;
  7. char c = getchar() ;
  8. while(c > '9' || c < '0'){
  9. if(c == '-')
  10. f = -1 ;
  11. c = getchar() ;
  12. }
  13. while(c >= '0' && c <= '9'){
  14. x = x * 10 + c - '0' ;
  15. c = getchar() ;
  16. }
  17. return x * f ;
  18. }
  19. ll t , n , m , k , a[maxn] , c[maxn] , b[maxn] ;
  20. char s[maxn] ;
  21. void solve(){
  22. n = read() ;
  23. m = read() ;
  24. priority_queue < ll , vector < ll > , less < ll > > q ;
  25. ll Ans = 0 ;
  26. for(int i = 1 ; i <= n ; i ++){
  27. a[i] = read() ;
  28. ll res = a[i] , cnt = 0 ;
  29. while(1){
  30. if(res % 10 == 0){
  31. cnt ++ ;
  32. res /= 10 ;
  33. }
  34. else{
  35. break ;
  36. }
  37. }
  38. q.push(cnt) ;
  39. cnt = 0 ;
  40. res = a[i] ;
  41. while(res != 0){
  42. res /= 10 ;
  43. cnt ++ ;
  44. }
  45. Ans += cnt ;
  46. }
  47. ll ans = 0 ;
  48. while(1){
  49. if(q.top() == 0 || q.empty()){
  50. break ;
  51. }
  52. ans += q.top() ;
  53. q.pop() ;
  54. if(q.empty()){
  55. break ;
  56. }
  57. q.pop() ;
  58. }
  59. if(Ans - ans < m + 1){
  60. cout << "Anna" << endl ;
  61. return ;
  62. }
  63. else{
  64. cout << "Sasha\n" ;
  65. }
  66. }
  67. int main(){
  68. t = read() ;
  69. while(t --){
  70. solve() ;
  71. }
  72. return 0 ;
  73. }

喜欢作者的记得关注点赞加收藏哦~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/667679
推荐阅读
相关标签
  

闽ICP备14008679号