[iHOOYA]2023年1月28日作业解析

小白鼠再排队
N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,
要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。
帽子的颜色用 “red”,“blue”等字符串来表示。
不同的小白鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。

输入
输入第一行为一个整数N,表示小白鼠的数目。 下面有N行,每行是一只白鼠的信息。
第一个为正整数,表示白鼠的重量,不超过整型范围;
第二个为字符串,表示白鼠的帽子颜色,字符串长度不超过10个字符。 注意:白鼠的重量各不相同。
输出
按照白鼠的重量从小到大的顺序输出白鼠的帽子颜色。
样例输入
3
30 red
50 blue
40 green
样例输出
red
green
blue

#include <bits/stdc++.h>
using namespace std;
//方法1
int main() 
{
	int n;//小白鼠的数量
	cin>>n;
	int w[n];//存小白鼠的重量
	string color[n];//存小白鼠的帽子颜色
	for(int a =0;a<n;a++)
		cin>>w[a]>>color[a];//用户输入每只老鼠的重量和帽子颜色
	
	for(int a =0;a<n;a++)
	{
		for(int b =0;b<n-a-1;b++)
		{
			if(w[b]>w[b+1])
			{
				swap(w[b],w[b+1]);
				swap(color[b],color[b+1]);
			}
		}
	}
	for(int a =0;a<n;a++)
		cout<<color[a]<<endl;
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
//方法二

struct ls
{
	int weight;//老鼠的重量属性
	string color;//老鼠的颜色属性
};

bool cmp(ls a,ls b)//改写sort函数排序规则
{
	if(a.weight>b.weight)
		return false;
	else
		return true;
}

int main() 
{
	int n;//小白鼠的数量
	cin>>n;
	ls arr[n];//结构体数组
	
	for(int a =0;a<n;a++)
		cin>>arr[a].weight>>arr[a].color;//用户输入重量和颜色
	
	sort(arr,arr+n,cmp);
		
	for(int a =0;a<n;a++)
		cout<<arr[a].color<<endl;
	return 0;
}

多余的数
小A同学在完成一个数学题:求给定的10个整数的和。小A同学在求完之后发现和参考答案对不上,
检查后发现在求和过程中多计算了一个数,其他过程没有问题。
现给出小A计算用的11个数,以及正确的参考答案,请算出小A同学多计算的那一个数。

输入:第一行11个正整数,每个数小于等于1000000 第二行一个整数,表示参考答案
输出:一个整数,表示多计算的那一个数。

样例输入
2 4 6 8 1 3 5 7 9 5 11
54

样例输出7

提示
样例中原有的10个数为2 4 6 8 1 3 5 9 5 11,和为54,多余的数为7。

#include <bits/stdc++.h>
using namespace std;

int main() 
{
	int arr[11],sum=0;
	for(int a =0;a<11;a++)
	{
		cin>>arr[a];
		sum+=arr[a];//对数组元素求和
	}
	int ans;
	cin>>ans;
	cout<<sum-ans;//数组元素的和-参考答案就是多余的数

	return 0;
}

最好的草
奶牛Bessie计划好好享受柔软的春季新草。新草分布在R行C列的牧场里。它想计算一下牧场中的草丛数量。
在牧场地图中,每个草丛要么是单个“#”,要么是有公共边的相邻两个“#”。给定牧场地图,计算有多少个草丛。
例如,考虑如下5行6列的牧场地图
.#…
…#…
…#…#
…##.
.#…
这个牧场有5个草丛:一个在第一行,一个在第二列横跨了二、三行,一个在第三行,一个在第四行横跨了四、五列,最后一个在第五行。

输入:第一行包含两个整数R和C,中间用单个空格隔开。 接下来R行,每行C个字符,描述牧场地图。字符只有“#”或“.”两种。(1 <= R, C <= 100 )

输出:输出一个整数,表示草丛数。

样例输入
5 6
.#…
…#…
…#…#
…##.
.#…
样例输出
5

#include <bits/stdc++.h>
using namespace std;

int main() 
{
	int r,c;//r是行,c是列
	cin>>r>>c;
	int arr[r][c];
	for(int a =0;a<r;a++)
		for(int b =0;b<c;b++)
			cin>>arr[a][b];//用户输入二维数组字符
	int count=0;
	for(int a =0;a<r;a++)
	{
		for(int b =0;b<c;b++)
		{
			if(arr[a][b]=='#'&&arr[a][b+1]=='#')//找当前坐标的草相邻右边的草
			{
				count++;
				arr[a][b]='.';
				arr[a][b+1]='.';
			}
			else if(arr[a][b]=='#'&&arr[a+1][b]=='#')//找当前坐标的草相邻向下的草
			{
				count++;
				arr[a][b]='.';
				arr[a+1][b]='.';
			}
			else if(arr[a][b]=='#')//单独的草丛
			{
				count++;
				arr[a][b]='.';
			}
		}
	}
	cout<<count;	
	return 0;
}

字符串中最长的连续出现的字符
求一个字符串中最长的连续出现的字符,输出该字符及其出现次数。字符串中无空白字符(空格、回车和tab),如果这样的字符不止一个,
则输出出现最早的字符。

输入:一行,一个不包含空白字符的字符串,字符串长度小于200。
输出:一行,输出最长的连续出现的字符及其最长的连续出现次数,中间以一个空格分开。

样例输入aaaaadbbbbbcccccccdddddddddd
样例输出d 10

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	cin >> s;
	//cp是存放最大次数的临时变量,count计数最大次数
	int cp = -1, count = 1;
	char c;//保存最大出现次数的字符
	c = s[0];
	for (int a = 0; a < s.length() - 1; a++)
	{
		if (s[a] == s[a + 1])
		{
			count++;
			if (count > cp)
			{
				cp = count;
				c = s[a];
			}
		}
		else
			count = 1;
	}
	cout << c << " " << cp;

	return 0;
}

打字员
有一个打字员,他打字的时候有个习惯,从来不用 Shift 来切换大小写,只用 Caps Lock。 现在给他一个地铁站的名字,你需要写一个程序来告诉他,他需要敲击多少下键盘才能打出 这个地铁站名。

输入
第一行输入一个数字 n (n<1000),表示共有多少个需要处理的车站名。从第 2 到第 n+1 行是这 n 个车站名。车站名由英文字母构成,名字的长度不会超过 100 个字符。已知开始时 键盘是输入小写字母的状态。

输出
这个打字员敲击键盘的次数。

样例输入
5
BeiJingDaXueDongMen
AAAaaaBBBbbbABAB
AmericanRAILWAY
AaAaAa
DFjfkdaB

样例输出
31
21
18
12
11

#include <bits/stdc++.h>
using namespace std;
//方法1
int main()
{
	int n = 0;
	cin >> n;
	string s[n];//字符串数组
	bool flag = true; //存储当前的大小写状态
	int count = 0;//计数大写键敲击的次数
	for (int i = 0; i < n; i++)
		cin >> s[i];
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < s[i].length(); j++)
			if (flag == true && (s[i][j] >= 'A' && s[i][j] <= 'Z'))
			{
				count++;
				flag = false;
			}
			else if (flag == false && (s[i][j] >= 'a' && s[i][j] <= 'z'))
			{
				count++;
				flag = true;
			}
		cout << count + s[i].length() << endl;
		count = 0;
		flag = true;
	}
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
int pd(char c)
{
	if(c>='a'&&c<='z')
		return 1;
	return 2;
}
int main()
{
	int n;
	string s[1000];
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>s[i];
	for(int i=0;i<n;i++)
	{
		int len=s[i].length(),t=0;
		if(pd(s[i][0])==1)     //第一个字母单独处理
			t++;
		else
			t+=2;
		for(int j=1;j<len;j++)
		{
			if(pd(s[i][j])==pd(s[i][j-1]))    //是否与前一个字母相同
				t++;     //相同直接打
			else
				t+=2;     //不相同先切换大小写再打
		}
		cout<<t<<endl;
	}
	return 0;
}

田忌赛马
在田忌赛马的故事中,孙膑用自己的下等马对战对手的上等马,自己上等马对阵对手的中等马,自己的中等马对阵对手的下等马,从而赢得了胜利。现在即将进行的是N匹马的赛马比赛。双方队伍的马各分为N等。已知只有当我方马的等级比对方马等级高X等以上(包含X)时,我方才可以取得这场比赛的胜利。如果在N场比赛中我方的胜场数大于对方,则我方取得最终的胜利。现在已知对方这N场比赛的出战方案,请计算所有令我方最终获胜的出战方案。

输入:第一行两个整数,N和X。N≤9, 0 ≤ X < N。 第二行N个正整数,A(1)…A(N)。A(i)表示第i场比赛对方马的等级,1≤i≤N。等级越高越强

输出:按字典序输出所有我方最终获胜的方案,每个方案一行。每行是N个正整数,第i个数表示我方第i场比赛马的等级。

样例输入
样例1输入
3 1
3 2 1

样例2输入
3 0
3 1 2

样例输出
样例1输出
1 3 2

样例2输出
1 2 3
1 3 2
2 1 3
3 1 2
3 2 1
在这里插入图片描述

生成括号
Paul是一名数学专业的同学,在课余选修了C++编程课,现在他能够自己写程序判断判断一个给定的由’(‘和’)'组成的字符串是否是正确匹配的。可是他不满足于此,想反其道而行之,设计一个程序,能够生成所有合法的括号组合,请你帮助他解决这个问题。

输入:输入只有一行N,代表生成括号的对数(1 ≤ N ≤ 10)。
输出:输出所有可能的并且有效的括号组合,按照字典序进行排列,每个组合占一行。
样例输入3
样例输出
((()))
(()())
(())()
()(())
()()()

本题的麻烦在于要按字典序进行排列。做法有二:一是先穷举所有组合然后排序二是找规律后用字符移位的方法逐一输出。
穷举再排序的方案要动态创建二维字符数,字符移位则只需要一个一维字符数组即可,相对简单。
原理是先生成指定数量的嵌套括号对,放在数组里然后找到最里层的括号对,接着寻找其后面的左括号,找到则将括号对后面的字符左侧,将括号对插入到所找到的左括号的位置。然后在移动的括号对之前寻找最右侧的第一个括号对,重复上述操作如果未找到左括号,则找右括号,找到后右移,直到移到最后面。关键:最左侧出现新的成对的括号时,从括号后面重新生成数量-1的嵌套括号对放在数组里。然后递归调用,直到数组变成“() () ()”的形式。
#include<bits/stdc++.h>
using namespace std;
struct pos
{
	char c;
	int index;
};
bool cmp(pos p1,pos p2){
	if(p1.index<p2.index)  
		return true;
	else                  
		return false;
}
int main() 
{
	string s;   
    pos pos1;
	stack<pos> bracket_r;  
	stack<pos> bracket_l;
	vector<pos> help;
	bool flag=false;
	while(1){
		cin>>s;
		for(int i=0;i<s.length();i++)
		{
			pos1.c=s[i];
			pos1.index=i;
			if(s[i]=='(')
				bracket_l.push(pos1);
			else if(s[i]==')')
				if(bracket_l.empty()==false)
					bracket_l.pop();
				else
					bracket_r.push(pos1);	
		}
		while(bracket_l.empty()==false)
		{
			help.push_back(bracket_l.top());
			bracket_l.pop();
		}
		while(bracket_r.empty()==false)
		{
			help.push_back(bracket_r.top());
			bracket_r.pop();
		}
		sort(help.begin(),help.end(),cmp);
		cout<<s<<endl;	
		for(int i=0;i<s.length();i++){
			for(int j=0;j<help.size();j++)
				if(help[j].index==i){
					if(help[j].c=='(')
						cout<<"$";
					else if(help[j].c==')')
						cout<<"?";
					flag=true;
					break;
				}		
			if(flag==false)
				cout<<" "; 
			flag=false;
		}
		cout<<endl;
		help.clear();
		while(bracket_l.empty()==false)
			bracket_l.pop();
		while(bracket_r.empty()==false)
			bracket_r.pop();
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n, len, k, b[200][10];
	cin >> n;
	for (int i = 1; i <= n; i++) //输入序列的初始值
	{
		cin >> b[i][1];
		b[i][2] = 1; //最大子序列长度初始为1
		b[i][3] = 0; //表示后面无连接项
	}
	for (int i = n - 1; i >= 1; i--) //求最长不下降序列
	{
		len = 0;
		k = 0;
		for (int j = i + 1; j <= n; j++)
		{
			if (b[j][1] >= b[i][1] && (b[j][2] > 1))
			{
				len = b[j][2];
				k = j;
			}
			if (len > 0)
			{
				b[i][2] = len + 1;
				b[i][3] = k;
			}
		}
	}
	k = 1;
	for (int i = 1; i <= n; i++) //求最长不下降序列的起始位置
	{
		if (b[i][2] > b[k][2])
			k = i;
	}
	cout << "max=" << b[k][2] << endl; //输出结果
	while (k != 0) //输出最长不下降序列
	{
		cout << ' ' << b[k][1];
		k = b[k][3];
	}
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值