问题描述
回⽂文串串,是⼀一种特殊的字符串串,它从左往右读和从右往左读是⼀一样的。⼩小⻰龙⻰龙认为回⽂文串串才是完美
的。现在给你⼀一个串串,它不不⼀一定是回⽂文的,请你计算最少的交换次数使得该串串变成⼀一个完美的回⽂文
串串。
交换的定义是:交换两个相邻的字符
例例如mamad
第⼀一次交换 ad : mamda
第⼆二次交换 md : madma
第三次交换 ma : madam (回⽂文!完美!)
输⼊入格式
第⼀一⾏行行是⼀一个整数N,表示接下来的字符串串的⻓长度(N <= 8000)
第⼆二⾏行行是⼀一个字符串串,⻓长度为N.只包含⼩小写字⺟母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
样例例输⼊入
5
mamad
样例例输出
3
代码:
#include#include 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 =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 思考点:
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“
代码:
#includeusing 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< =5) { for(int i=a-8;i 反思:
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#includeusing 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< 注意点:要注意他的顺序
2、for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
a[i]+=")";
}这里1个1个括号,2个2个括号的写法(很有意思)
BASIC-22. FJ的字符串串
3、s+=(char)(i+‘0’);
一定要注意加上**‘0’**,因为这里要强转为字符问题描述
FJ在沙盘上写了了这样⼀一些字符串串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的规律律并写所有的数列列AN吗?
输⼊入格式
仅有⼀一个数:N ≤ 26。
输出格式
请输出相应的字符串串AN,以⼀一个换⾏行行符结束。输出中不不得含有多余的空格或换⾏行行、回⻋车符。
样例例输⼊入
3
样例例输出
ABACABA
我的做法:#includeusing 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 大佬的做法:
#includeusing 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#includeusing namespace std; int main(){ int n; cin>>n; int s[n][n]; for(int i=0;i >s[i][j]; } } for(int i=0;i =(n/2)) cout<<(i+1)<<" "; } return 0; } 思考点:
1、因为好的芯片会多于半数,所以只要>=n/2即可(当然j=i的情况是自身给自身进行测量所以都为1,算入没有意义)欢迎分享,转载请注明来源:内存溢出
评论列表(0条)