Bootstrap

GESP四级内训

GP6904 加密整数

题目描述

小杨同学发明了一种新型密码,对于每一个小写英文字母,该小写字母代表了一个正整数,即该字母在字母顺序中的位置,例如字母 a 代表了正整数 11,字母 b 代表了正整数 22;对于每一个大写英文字母,该大写字母代表了一个负整数,即该字母的 ASCII 码的相反数,例如字母 A 代表了负整数 −65−65。小杨同学利用这种放缩对一个整数进行了加密并得到了一个由大写字母和小写字母组成的字符串,该字符串中每个字母所代表数字的总和即为加密前的整数,例如 aAc 对应的加密前的整数为 1+(−65)+3=−611+(−65)+3=−61。

对于给定的字符串,请你计算出它对应的加密前的整数是多少。

输入格式

第一行一个正整数 n,表示字符串中字母的个数。
第二行一个由大写字母和小写字母的字符串 T,代表加密后得到的字符串。

输出格式

输出一行一个整数,代表加密前的整数。

输入样例

3 aAc

输出样例

-61

思路:先逐个判断字母的大小写,然后将判断的字符作相对应的处理转换为数字,用sum初始化做处理加减法。

#include<iostream>
using namespace std;
int main(){
	int n;
	string s;
	cin>>n;
	cin>>s;
	int sum=0;
	for(int i=0;i<s.size();i++){
		if(s[i]>='a'&&s[i]<='z'){
			int m=int(s[i]-'a')+1;
			sum+=m;
	}
	if(s[i]>='A'&&s[i]<='Z'){
			int m1=int(s[i]-'A')+65;
			sum-=m1;
	}
	}
	cout<<sum;
	
	return 0;
} 

GP6905 有趣数列

题目描述

小杨最近发现了一种有趣的数列,这个数列是这样生成的:

  • 数列的第一项 a1​ 是 1;
  • 如果 ak−1​−k 是正整数并且没有在数列中出现过,那么数列的第 k 项ak​ 为ak−1​−k,否则为 ak−1​+k。

小杨想知道这个数列的前 n 项从小到大排序后的结果。

输入格式

第一行,一个正整数 n。

输出格式

一行,n 个空格分隔的整数,表示数列的前 n 项从小到大排序后的结果。

输入样例1

5

输出样例1

1 2 3 6 7

输入样例2

8

输出样例2

1 2 3 6 7 12 13 20

主要思路:

对于已经存在的数列,新出现的数列的值可以重复 此时需要遍历整体数列来判断,但重新遍历耗费时间,所以引入一个新的数组,当数组值存在时,就进行标记,这样可以直接达到检测重复数组值的结果。此题引入数组b来做标记。

#include<bits/stdc++.h>
using namespace std;
 int a[30300],b[300010]; //a[30300]生成数列 b[300010]标记数列。
int main(){
  int n;
  cin>>n;
  a[1]=1;b[1]=1;
  
  for(int i;i<=n;i++){
  	int m=(a[i-1]-i),m1=(a[i-1]+i);
  	if(m>0&&b[m]==0){
  		a[i]=m;
  		b[m]=1;
	  }else{
	  	a[i]=m1;
	  	b[m1]=1;
	  }
  }
  sort(a+1,a+n+1);
  for(int i=1;i<=n;i++){
  	cout<<a[i]<<" ";
  }
	return 0;
} 

;