我是靠谱客的博主 还单身红酒,最近开发中收集的这篇文章主要介绍Educational Codeforces Round 121 (Rated for Div. 2)A. Equidistant LettersB. Minor Reduction,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • A. Equidistant Letters
  • B. Minor Reduction

A. Equidistant Letters

题目链接:

A. Equidistant Letters

题目分析:

这道题的要求是,给定一个字符串,对其重新排列输出,排列方式为找出所有重复出现的字符,使得重复出现的字符间的间距都相等,例如abacbc,这里abc都有重复,我们只需让其变成这样abcabc或aabbcc,这些字符串之间,相同字符的间距都相同。
abcabc:两个a,两个b,两个c,它们之间的间距都为2
aabbcc:为1
我们只需找出一种并输出即可

通过观察我们发现,只要把重复出现的找出,把他们放在一起即可

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

int main(){
	int n;
	cin >> n;
	while(n--){
		char str[1005];
		cin >> str;
		int len = strlen(str);
		int hash[26] = { 0 };
		//将每种字符出现次数统计
		for(int i = 0; i < len; i++){
			hash[str[i] - 'a']++;
		}
		//按顺序输出
		for(int i = 0; i < 26; i++){
			for(int j = 0; j < hash[i]; j++){
				printf("%c", i + 'a');
			}
		}
		printf("n");
	}
} 

B. Minor Reduction

题目链接:

B. Minor Reduction

题目分析:

根据用例我们可以看出,所谓的归约其实就是将一个数,找出其中两个位置相邻的数字(单个数字),归约操作只执行一次,一个数有多种归约结果,我们找出规约后值最大的即可。

解决方案:

首先x的范围是10 - 10的20万次方如果x是两位数,那不必考虑,它的归约方式只有一种,其他位数的话我们则要分析一下:

  1. 首先两个个位数相加的结果一定是在0到18之间的
  2. 一次归约后,数字的长度最好的情况就是和原长一样

假如一个数所有相邻数的归约结果都小于10,那么我们就将最左边的两位数归约,因为:我们假设最两边的数为a,b,a+b<10,且a+b一定大于a,我们要保证高位上的数字最大。
假如一个数有相邻两个数归约结果>=10,说明他可以保证数字的长度不变,我们还是要保证较高位上的数字不变,而a + b的结果一定实1x,即高位上一定为1,而1是最小的数,我们要尽量将其靠近右边,所以我们只需找出最右边a+b>=10的情况,这就是最大的结果。

在这里插入图片描述
大家可以自己去打草稿分析一下。

代码如下:

#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

int n;

void solove(){
	char s[200005];
	cin >> s;
	
	int len = strlen(s);
	bool flag = true;//用来标记该数是否拥有能保持原本长度的归约情况
	for(int i = len - 1; i >= 0; i--){//从左边开始,也就是低位数字
		if(s[i] + s[i - 1] - '0' - '0'> 9){//判断是否有结果为两位数的归约情况
			flag = false;//进行标记
			for(int j = 0; j < len; j++){
				if(j == i - 1){
					printf("%d", s[i] + s[i - 1] - '0' - '0');
					j++;
				}
				else{
					printf("%c", s[j]);
				}
			} 
			break;
		}
	}
	if(flag){//不存在上述情况则将前面两位数归约
		printf("%d", s[0] + s[1] - '0' - '0');
		char* p = s + 2;
		printf("%s", p);
	}
	printf("n");
}

int main(){
	cin >> n;
	while(n--){
		solove();
				
	}
	return 0;
}

最后

以上就是还单身红酒为你收集整理的Educational Codeforces Round 121 (Rated for Div. 2)A. Equidistant LettersB. Minor Reduction的全部内容,希望文章能够帮你解决Educational Codeforces Round 121 (Rated for Div. 2)A. Equidistant LettersB. Minor Reduction所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部