蓝桥杯day-4

BASIC-19. 完美的代价!

问题描述
回⽂文串串,是⼀一种特殊的字符串串,它从左往右读和从右往左读是⼀一样的。⼩小⻰龙⻰龙认为回⽂文串串才是完美
的。现在给你⼀一个串串,它不不⼀一定是回⽂文的,请你计算最少的交换次数使得该串串变成⼀一个完美的回⽂文
串串。
交换的定义是:交换两个相邻的字符
例例如mamad
第⼀一次交换 ad : mamda
第⼆二次交换 md : madma
第三次交换 ma : madam (回⽂文!完美!)
输⼊入格式
第⼀一⾏行行是⼀一个整数N,表示接下来的字符串串的⻓长度(N <= 8000)
第⼆二⾏行行是⼀一个字符串串,⻓长度为N.只包含⼩小写字⺟母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
样例例输⼊入
5
mamad
样例例输出
3
代码:

#include<iostream>
#include<cmath>
using namespace std;

int main(){
	string s;
	int n;
	cin>>n>>s;
	int count=0;//调换次数
	int i,j=n-1,k;
	int flag=0;//判断是否存在奇数的字符 
	for(i=0;i<j;i++ )
	{
		for(k=j;k>=i;k--)
		{
			if(k==i)//在这一趟中没有字符相同的 
			{
				if(n%2==0||flag==1)
				{
					cout<<"Impossible";
					return 0;
				}
				flag=1;
				count+=n/2-i;
			 }
			 else if(s[i]==s[k]){//存在两个相同的字符 
			 	for(int l=k;l<j;l++){
			 		swap(s[l],s[l+1]);
			 		count++;
				 }
				 j--;
				 break;
			 }
		}
	 } 
	 cout<<count;
	 return 0;
} 

思考点:
1.impossible的情况:1)如果有一个字符是奇数的情况下,n的个数不可能是偶数;不可能出现两个字符是奇数的情况
2.如果存在一个字符是奇数的情况下,直接把它移到中间即可(当然在所有情况已经应到好,即前后对称的情况下)

它是一轮一轮地进行对比减少,头尾减少

BASIC-20. 数的读法!


问题描述
Tom教授正在给研究⽣生讲授⼀一⻔门关于基因的课程,有⼀一件事情让他颇为头疼:⼀一条染⾊色体上有成千上
万个碱基对,它们从0开始编号,到⼏几百万,⼏几千万,甚⾄至上亿。
⽐比如说,在对学⽣生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的。
所以,他迫切地需要⼀一个系统,然后当他输⼊入12 3456 7009时,会给出相应的念法:
⼗十⼆二亿三千四百五⼗十六万七千零九
⽤用汉语拼⾳音表示为
shi er yi san qian si bai wu shi liu wan qi qian ling jiu

这样他只需要照着念就可以了了。
你的任务是帮他设计这样⼀一个系统:给定⼀一个阿拉伯数字串串,你帮他按照中⽂文读写的规范转为汉语拼
⾳音字串串,相邻的两个⾳音节⽤用⼀一个空格符格开。
注意必须严格按照规范,⽐比如说“10010”读作“yi wan ling yi shi”⽽而不不是“yi wan ling shi”,“100000”读
作“shi wan”⽽而不不是“yi shi wan”,“2000”读作“er qian”⽽而不不是“liang qian”。
输⼊入格式
有⼀一个数字串串,数值⼤大⼩小不不超过2,000,000,000。
输出格式
是⼀一个由⼩小写英⽂文字⺟母,逗号和空格组成的字符串串,表示该数的英⽂文读法。
样例例输⼊入
1234567009
样例例输出
shi er yi san qian si bai wu shi liu wan qi qian ling jiu

思考点:
1、首先要把千位以内的数字说法弄出一个函数,因为后面说完的时候同样要用到前面的千万
2、通过位数的判断把数字分割为亿、万、千三个类别
3、不要忘记在万位以上时,万位与千之间的跨越如果是有零或者是连续的零的话要写上”ling“
在这里插入图片描述

代码:

#include<iostream>

using namespace std;
string s[10]={"ling ","yi ","er ","san ","si ","wu ","liu ","qi ","ba ","jiu "};
//string b[5]={"shi ","bai ","qian ","wan ","yi "};

string fuc(string t){
	string ans;
	int lent=t.length();
	if(lent>=4){
	
		ans+=s[t[0]-'0'];
		ans+="qian ";
	}if(lent>=3){
		if(t[lent-3]!='0'){
			ans+=s[t[lent-3]-'0'];
			ans+="bai ";
		}	
	}if(lent>=2){
		if(t[lent-2]=='1')
		{
			if(lent!=2)
			{
				ans+="yi shi ";
			}else ans+="shi ";
			
		}if(t[lent-2]!='0'&&t[lent-2]!='1')
		{
			ans+=s[t[lent-2]-'0'];
			ans+="shi "; 
		}
	}if(lent>=1)
	{
		if(t[lent-1]!='0')
		{
			ans+=s[t[lent-1]-'0'];
		}
	}
	return ans;
}


int main(){
	string s;
	cin>>s;
	int a=s.length();
	string sub;
	if(a==10)//亿 
	{
		sub=s.substr(0,2);
		cout<<fuc(sub)<<"yi ";
	}
	if(a==9)
	{
		sub=s.substr(0,1);
		cout<<fuc(sub)<<"yi ";
	}
	sub="";
	int flag=0;
	if(a>=5)
	{
		for(int i=a-8;i<a-4;i++)
		{
			if(i<0)continue;
			if(flag=0&&s[i]=='0') continue;
			sub+=s[i];
			flag=1;
		}
		if(flag==1)
			cout<<fuc(sub)<<"wan ";
		flag=0;
		sub="";
		for(int i=a-4;i<a;i++)
		{
			if(flag==0&&s[i]=='0')
			{
				continue;
			}
			if((i==a-1&&s[i-1]=='0')||(i==a-2&&s[i-1]=='0')||(i==a-3&&s[i-1]=='0'))
				cout<<"ling ";
			sub+=s[i];
			flag=1;
		}
	}
	if(a<=4)
	{
		sub=s;
		flag=1;
	}
	if(flag=1)
		cout<<fuc(sub);
	return 0;
} 

反思:
大佬的逻辑思维果然强,对于零的处理很赞

BASIC-21. Sine之舞

问题描述
最近FJ为他的奶⽜牛们开设了了数学分析课,FJ知道若要学好这⻔门课,必须有⼀一个好的三⻆角函数基本功。所
以他准备和奶⽜牛们做⼀一个“Sine之舞”的游戏,寓教于乐,提⾼高奶⽜牛们的计算能⼒力力。
不不妨设
An=sin(1–sin(2+sin(3–sin(4+…sin(n))…)
Sn=(…(A1+n)A2+n-1)A3+…+2)An+1
FJ想让奶⽜牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以⽅方便便奶⽜牛们做题。
输⼊入格式
仅有⼀一个数:N<201。
输出格式
请输出相应的表达式Sn,以⼀一个换⾏行行符结束。输出中不不得含有多余的空格或换⾏行行、回⻋车符。
样例例输⼊入
3
样例例输出
((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1

#include<iostream>

using namespace std;

int main(){
	string a[201];
	string s;
	int n;
	cin>>n;

	for(int i=1;i<=n;i++)
	{
		if(i==1)
		{
			a[i]="sin(1";
			continue;
		}
		a[i]=a[i-1];
		if(i%2==0)
		{
			a[i]+='-';
		}else a[i]+='+';
		a[i]+="sin(";
		a[i]+=char(i+'0');
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
			a[i]+=")"; 
	}
	for(int i=2;i<=n;i++)
		s+="(";
	for(int i=n;i>1;i--)
	{
		s+=a[n-i+1];
		s+="+";
		s+=(char)(i+'0');
		s+=")";
	}
	s+=a[n];
	s+="+1";
	cout<<s;
	return 0;
	
}

注意点:要注意他的顺序
2、

for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
a[i]+=")";
}

这里1个1个括号,2个2个括号的写法(很有意思)
3、s+=(char)(i+‘0’);
一定要注意加上**‘0’**,因为这里要强转为字符

BASIC-22. FJ的字符串串

问题描述
FJ在沙盘上写了了这样⼀一些字符串串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的规律律并写所有的数列列AN吗?
输⼊入格式
仅有⼀一个数:N ≤ 26。
输出格式
请输出相应的字符串串AN,以⼀一个换⾏行行符结束。输出中不不得含有多余的空格或换⾏行行、回⻋车符。
样例例输⼊入
3
样例例输出
ABACABA
我的做法:

#include<iostream>

using namespace std;
int main(){
	int n;
	cin>>n;
	if(n>26)
	{
		cout<<"输入错误";
		return 0;
	}
	string s[26];
	s[0]="A";
	for(int i=1;i<n;i++)
	{
		s[i]=s[i-1]+(char)('A'+i)+s[i-1];
	}
	cout<<s[n-1];
	return 0;
} 

大佬的做法:

#include <iostream>
using namespace std;
string dfs(int n) {
if(n == 1) {
return "A";
} else {
return dfs(n - 1) + (char)(n + 'A' - 1) + dfs(n - 1);
}
}
int main() {
int n;
cin >> n;
cout << dfs(n);
return 0;
}

思考点:可以通过递归的方法进行实现,减少了空间(有空间限制时)

BASIC-23. 芯⽚片测试

问题描述
有n(2≤n≤20)块芯⽚片,有好有坏,已知好芯⽚片⽐比坏芯⽚片多。
每个芯⽚片都能⽤用来测试其他芯⽚片。⽤用好芯⽚片测试其他芯⽚片时,能正确给出被测试芯⽚片是好还是坏。⽽而
⽤用坏芯⽚片测试其他芯⽚片时,会随机给出好或是坏的测试结果(即此结果与被测试芯⽚片实际的好坏⽆无
关)。
给出所有芯⽚片的测试结果,问哪些芯⽚片是好芯⽚片。
输⼊入格式
输⼊入数据第⼀一⾏行行为⼀一个整数n,表示芯⽚片个数。
第⼆二⾏行行到第n+1⾏行行为n*n的⼀一张表,每⾏行行n个数据。表中的每个数据为0或1,在这n⾏行行中的第i⾏行行第j列列
(1≤i, j≤n)的数据表示⽤用第i块芯⽚片测试第j块芯⽚片时得到的测试结果,1表示好,0表示坏,i=j时⼀一律律
为1(并不不表示该芯⽚片对本身的测试结果。芯⽚片不不能对本身进⾏行行测试)。
输出格式
按从⼩小到⼤大的顺序输出所有好芯⽚片的编号
样例例输⼊入
3
1 0 1
0 1 0
1 0 1
样例例输出
1 3

#include<iostream>

using namespace std;

int main(){
	int n;
	cin>>n;
	int s[n][n];
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin>>s[i][j];
		}
	}
	for(int i=0;i<n;i++)
	{
		int sum=0;
		for(int j=0;j<n;j++)
		{
			if(j!=i)
				sum+=s[i][j];
		}
	//	cout<<sum<<endl;
		if(sum>=(n/2))
			cout<<(i+1)<<" ";
	}
	
	return 0;
}

思考点:
1、因为好的芯片会多于半数,所以只要>=n/2即可(当然j=i的情况是自身给自身进行测量所以都为1,算入没有意义)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值