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,算入没有意义)