菜鸟版,记录好思路
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan 排序,只需要 11 次交换。对于字符串 qiao 排序,总共需要 44 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100100 次交 换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要 100100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。
看了真题官方解答各位大佬的题解解答之后的思路
//思路1:要求字典序最小,那肯定要尽量让字母从a开始挨个出现 —— a,b,c,d.....
//思路2:冒泡排序中,如果一个数组是完全倒序,则需要的交换的次数最多,尽可能选用完全倒序的数组,可以使字母数尽可能少
//思路3:完全倒序的数组,用冒泡排序一共要交换 n*(n-1)/2 次 —— (n-1) + (n-2) + ... + 3 + 2 + 1 , 等差数列求和公式 //思路4:解方程 n*(n-1)/2 = 100, 得 n ~ 14.65 ,所以字母最少为15个
//思路5: 15个字母从 a 开开始,依次是 a,b,c,d,e,f,g,h,i,j,k,l,m,n,o
//思路5:但是当 n = 15时,完全倒序的数组需要排105次,显然不符合题目100次的要求,所以要在基础上进行修改
//思路6: 15个字母完全倒序 —— o,n,m,l,k,j,i,h,g,f,e,d,c,b,a 扣除5次排序,还要字典序最小,将第六个字母 j 移至第一位即可
//注 和比较次数没关系,j移动了5个位置,可以少交换5次,移动其他字母也是交换100次,只是j放在第一位是字典序最小的情况
//最终结果:j,o,n,m,l,k,i,h,g,f,e,d,c,b,a
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
cout<<"jonmlkihgfedcba"<<endl;
return 0;
}
题目描述
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。
请计算这次考试的最高分、最低分和平均分。
输入描述
输入的第一行包含一个整数n (1≤n≤10^4),表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
输出描述
输出三行。
第一行包含一个整数,表示最高分。
第二行包含一个整数,表示最低分。
第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。
输入输出样例
示例
输入7 80 92 56 74 88 99 10
输出 99 10 71.29
//这个也就是找最大值和最小值,再求个平均数,坑点1在于:保留两位小数
//坑点2在于:%.2lf会自动四舍五入
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int len;
int sc[10000];
cin>>len;
int max=0,min=100;
double sum=0;
for(int i=0;i<len;i++)
{
cin>>sc[i];
if(max<sc[i])
{
max=sc[i];
}
if(sc[i]<min)
{
min=sc[i];
}
sum+=sc[i];
}
double average=sum/len;
cout<<max<<endl;
cout<<min<<endl;
printf("%.2lf",average);
return 0;
}