2019秋季期末实验复习C++【实验九:结构体】

1.评委打分
【问题描述】
校园卡拉OK比赛设置了7名评委,当一名选手K完歌之后,主持人报出歌手名字后, 7位评委同时亮分,按照惯例,去掉一个最高分和一个最低分后,其余5位评委评分总和为该选手的最终得分。
一共有n组选手参加比赛,请你编写一个程序,当所有比赛结束后,列出所有选手的排名以及最终得分情况。
假定不会出现总分相同的情况(总分相同时,以出场顺序优先排名还是?以后再说吧! 呵呵,暂时不管吧)。

【输入形式】
第1行为一个正整数n,表示参赛人数。随后n行,每行开始为选手的名字,随后7个正整数表示评委亮分情况,数据间以空格分隔。

【输出形式】
按名次升序输出所有选手的名字以及总分,总共n行。

【样例输入】

4

Alice 90 90 85 92 90 90 90

Bob 92 99 88 92 92 92 92

Cindy 80 85 94 94 94 94 94

Dony 95 95 100 90 95 95 95

【样例输出】

Dony 475

Cindy 461

Bob 460

Alice 450

#include<iostream>
#include<algorithm>
using namespace std;
struct people {
	char name[5];
	int score[7];
	int total;
	int max;
	int min;
};
bool cmp(people a,people b) {
	return a.total>b.total ;
}
int main() {
	int n;
	cin>>n;
	people ren[n];
	for(int i=0; i<n; i++) {
		cin>>ren[i].name;
		ren[i].max=0;
		ren[i].min=100;
		ren[i].total=0;
		for(int j=0; j<7; j++) {
			cin>>ren[i].score[j];
			ren[i].total+=ren[i].score[j] ;
			if(ren[i].score[j]>=ren[i].max) {
				ren[i].max=ren[i].score[j];
			}
			if(ren[i].score[j]<=ren[i].min) {
				ren[i].min=ren[i].score[j];
			}

		}
		ren[i].total=ren[i].total-ren[i].max-ren[i].min;
	}
	sort(ren,ren+n,cmp);
	for(int k=0; k<n; k++) {
		cout<<ren[k].name <<" "<<ren[k].total <<endl;
	}

	return 0;

}

2.招聘
【问题描述】
某公司需要招聘一批员工,该公司有自己独特的评价体系,对应聘者设立了 3 个指标:技能值 Ki、智慧值 Ii 和忠诚度 Ei ,i=1, 2, …
经过严格的初选和复选以及各项测试以后,有 N 个人进入最后的名单,公司给出了每个人的各项指标值,并规定对于某人 i,如果存在另外人 j,有Ki < Kj 、Ii < Ij 、Ei < Ej ,则 i 将会被淘汰。

请找出总共有多少人会被淘汰。

【输入形式】
第一行包含一个整数 N (1≤ N ≤ 500000),表示最终进入评价名单的人数。第二行包括 N 个整数 Ki,第三行包含 N 个整数 Ii,第四行包含 N 个整数 Ei ,0 ≤ Ki、Ii 、 Ei ≤ 109。

【输出形式】
输出为一行一个整数。

【样例输入】
3
1 4 2
4 3 2
2 5 3

【样例输出】
1

#include<iostream>
using namespace std;
//声明结构体类型Stuff
struct Stuff {
	int k;
	int i;
	int e;
};
int main() {
	int n;
	cin>>n;
	Stuff ren[n];
	int count=0;
	//每行输入一种属性,每一列表示一人
	for(int h=0; h<n; h++) {
		cin>>ren[h].k;
	}
	for(int h=0; h<n; h++) {
		cin>>ren[h].i ;
	}
	for(int h=0; h<n; h++) {
		cin>>ren[h].e ;
	}
	//循环判断
	for(int q=0; q<n; q++) {
		for(int r=0; r<n; r++) {
			if(ren[r].k >ren[q].k &&ren[r].i >ren[q].i &&ren[r].e >ren[q].e) {
				count++;
				break;
			}
		}
	}
	cout<<count;
	return 0;
}

3.火星人足球赛

【问题描述】

火星人足球赛的比赛规则与地球人的比赛规则有些非常相似,比如严重犯规,将被给予黄牌警告,特别严重的犯规,将给予红牌直接罚下,如果有人得到第2张黄牌,则自动获得红牌罚下,比赛同样采取主客场制。

与地球人足球赛不同的是,火星人足球赛每队可以上场的人数不会固定为11人,可以多个人,比赛时间也会更长一些。

比赛时的裁判员是机器人,判罚非常严厉,如果有人获得红黄牌,机器人裁判将自动记录当时的情况。

【输入形式】

输入的第一行为主队队名,第二行为客队队名,队名的长度不超过20个字符。

第三行为一个整数 n (0 ≤ n ≤ 90) ,表示得到红黄牌的犯规次数。

接下来的n行,每行包含用空格分隔的4个部分,表示犯规的情况:

首先为一个整数,表示犯规的时间(分钟)

接着为一个字符"h"或"a",如果为"h",表示该张牌会给到主队球员,否则会给到客队球员

接下来为球员编号m (1 ≤ m ≤ 99)

接下来为一个字符"y"或"r",如果为"y",表示为黄牌,否则为红牌

不同球队的球员可能有相同的号码,在同一球队球员的号码不相同,犯规记录按时间顺序排列。

【输出形式】
输出按时间顺序排列的获得红牌的记录,如果时间相同,则主队排在前面,如果同一时间同一球队有多人获得红牌,则编号大的排在前面。每个红牌一行,包含3个部分:球员所属球队的名字、犯规球员编号、获得红牌时间。

如果全场比赛无红牌,输出"No Red Card"

【样例输入】
MC
CSKA
9
28 a 3 y
62 h 25 y
66 h 42 y
70 h 25 y
77 a 4 y
79 a 25 y
82 h 42 r
89 h 16 y
90 a 13 r

【样例输出】
MC 25 70
MC 42 82
CSKA 13 90

#include<iostream>
using namespace std;
struct Game {
	int time;
	string team;
	int number;
	char brand;
};
int main() {
	int n,i,j,k=0,x;
	string h,a,y;
	cin>>h>>a>>n;
	Game game[n+1],result[n+1];
	for(i=1; i<=n; i++) {
		cin>>game[i].time>>game[i].team>>game[i].number>>game[i].brand;
	}
	for(i=1; i<=n; i++) {
		if(game[i].brand=='r'&&game[i].team=="h") {
			result[k].team=h;
			result[k].number=game[i].number;
			result[k].time=game[i].time;
			k++;
		}
		if(game[i].brand=='r'&&game[i].team=="a") {
			result[k].team=a;
			result[k].number=game[i].number;
			result[k].time=game[i].time;
			k++;
		}
		if(game[i].brand=='y') {
			for(j=1; j<i; j++) {
				if(game[i].team==game[j].team&&game[i].number==game[j].number&&game[i].brand==game[j].brand) {
					if(game[i].team=="a") {
						result[k].team=a;
						result[k].number=game[i].number;
						result[k].time=game[i].time;
						k++;
					}
					if(game[i].team=="h") {
						result[k].team=h;
						result[k].number=game[i].number;
						result[k].time=game[i].time;
						k++;
					}
				}
			}
		}
	}
	for(i=1; i<k-1; i++) {
		if(result[i].time==result[i+1].time) {
			if(result[i].team==result[i+1].team) {
				if(result[i].number<result[i+1].number) {
					x=result[i].number;
					result[i].number=result[i+1].number;
					result[i+1].number=x;
				}
			} else if(result[i].team=="a") {
				x=result[i].number;
				result[i].number=result[i+1].number;
				result[i+1].number=x;
				y=result[i].team;
				result[i].team=result[i+1].team;
				result[i+1].team=y;
			}
		}
	}
	for(i=0; i<k; i++) {
		cout<<result[i].team<<" "<<result[i].number<<" "<<result[i].time<<endl;
	}
	if(k==0)cout<<"No Red Card";
	return 0;
}

4.看电影
【问题描述】

一场重要的国际学术会议,出席会议的 n 位科学家来自不同的国家,每位科学家都只熟悉一种语言,为方便起见,世界上所有的语言用1~1000的数字编号来列出。

晚上,主办方安排所有科学家去看电影,电影院里有 m 部电影,每部电影可以用两个不同的整数来描述,即音频语言和字幕语言的编号。看电影的科学家,如果他熟悉电影的音频语言,他会非常高兴,如果他熟悉字幕的语言,他基本上满意,如果他两种都不熟悉,他会感到不满意(请注意,每部电影的音频语言和字幕语言总是不同的)。

科学家们决定一起去看同一部电影。你必须帮助他们选择电影,使得非常高兴的科学家的数量是最大的,如果有多部这样的电影,在其中选择能使基本满意的科学家的数量最大,如果还有多部,则全部输出。如果没有这样的电影,则输出"unsatisfied"。

【输入形式】

输入的第一行为一个正整数 n (1 ≤ n ≤ 200000) ,表示科学家的数量。

第二行为 n 个正整数a1、a2、…、an (1 ≤ ai ≤ 1000),其中ai 表示第 i 位科学家熟悉的语言编号。

第三行包含一个正整数m(1 ≤ m ≤ 200000),表示电影院里的电影数量,编号从1~m。

第四行包含 m 个正整数 b1, b2, …, bm (1 ≤ bj ≤ 1000),其中 bj 表示第 j 部电影的音频语言。

第五行包含 m 个正整数 c1, c2, …, cm (1 ≤ cj ≤ 1000),其中 cj 表示第 j 部电影的字幕语言。

输入保证 bj ≠ cj 。

【输出形式】

输出为若干整数,从小到大,表示科学家们可以去选择去看的电影的编号。如果没有这样的电影,则输出"unsatisfied"。

【样例输入】

3
2 3 2
2
3 2
2 3

【样例输出】

2

#include<iostream>
#include<algorithm>
using namespace std;
struct Movie {
	int yin;
	int zi;
	int most;
	int besic;
	int number;
};
bool cmp1(Movie a,Movie b) {
	return a.most >b.most ;
}
bool cmp2(Movie a,Movie b) {
	return a.besic  >b.besic  ;
}
int main() {
	int n,m;
	cin>>n;//科学家
	int a[n];//科学家熟悉的语言编号
	for(int i=0; i<n; i++) {
		cin>>a[i];
	}
	cin>>m;//电影
	Movie b[m];//
	for(int i=0; i<m; i++) { //音频语言
		cin>>b[i].yin ;
		b[i].number =i+1;
	}
	for(int i=0; i<m; i++) { //字幕语言
		cin>>b[i].zi  ;
	}


	for(int p=0; p<m; p++) {
		int mos=0,bes=0;
		for(int q=0; q<n; q++) {
			if(b[p].yin ==a[q]) {
				mos++;
			}
			if(b[p].zi ==a[q]) {
				bes++;
			}
			if(q==n-1) {
				b[p].most =mos;
				b[p].besic =bes;
			}
		}
	}
	sort(b,b+m,cmp1);

	if(b[0].most >b[1].most ) {//输出非常满意人数最多的电影的情况1
		cout<<b[0].number ;
		return 0;
	} else if(b[0].most==b[1].most ) { //有多部电影非常满意人数相同
		int k=1;//非常满意人数相同的电影数量
		Movie manymost[m];
		manymost[0]=b[0] ;
		for(int i=1; i<m; i++) {
			if(b[i].most ==b[i-1].most ) {
				manymost[i]=b[i] ;
				k++;
			} else break;
		}
		sort(manymost,manymost+k,cmp2);//非常满意人数相同的电影按照基本满意排序
		if(manymost[0].besic>manymost[1].besic  ) {//输出选择能使基本满意的科学家的数量最大的电影情况2
			cout<<manymost[0].number ;
			return 0;
		} else {
			Movie manybes[k];
			int f=1;
			manybes[0]=manymost[0];
			for(int i=1; i<k; i++) {
				if(manymost[i].besic==manymost[i-1].besic) {
					manybes[i]=manymost[i] ;
					f++;
					continue;
				} else {
					for(int g=0; g<f; g++) {
						cout<<manybes[g].number <<" ";
					}
					return 0;
				}
			}
		}
	}
	cout<<"unsatisfied";
	return 0;
}

5.青蛙与蚊子

【问题描述】

有 n 只青蛙位于坐标轴 OX 上,对于每只青蛙,有两个已知值 xi、ti,表示第 i 只青蛙在坐标的位置(各不相同)以及它的舌头的长度。同样有 m 只蚊子一只接一只的落到坐标轴上,对于每只蚊子,有两个已知值, pj 表示第 j 只蚊子所在的位置,bj 为第 j 只蚊子的重量。青蛙和蚊子表示为坐标上的点。

如果蚊子和青蛙在同一位置或者在右边,青蛙可以吃掉蚊子,它们之间的距离不超过青蛙舌头的长度。

如果有几只青蛙都能在某一时刻吃到一只蚊子,最左边的青蛙就会吃掉它(最小的 xi)。吃完蚊子后,青蛙的舌头将增加蚊子重量的长度,在之后,青蛙又能够吃其他蚊子(在舌头长度增加之后)。

在所有蚊子落下以及青蛙吃掉所有可能的蚊子之后,对于每个青蛙,输出两个值,即吃蚊子的数量以及舌头的长度。

每只蚊子只有在青蛙吃完之前所有可能的蚊子之后才会落到坐标上,蚊子的值是按其落到坐标轴上的顺序给出的。

【输入形式】

输入的第一行为两个整数(1 ≤ n,m ≤ 2*105),表示青蛙和蚊子的数量。

接下来的 n 行,每行两个整数 xi、ti(0 ≤ xi、ti ≤ 109),表示第 i 只青蛙所在的位置以及它的舌头的初始长度,输入保证所有的 xi 互不相同。

接下来的 m 行,每行两个整数 pj、bj(0 ≤ pj、bj ≤ 109),表示第 j 只蚊子落下的位置以及它的重量。

【输出形式】

输出为 n 行,第 i 行包含另两个整数值 ci、li,表示被第 i 只青蛙吃掉的蚊子数量以及最终的青蛙的舌头长度。
【样例输入1】

4 6
10 2
15 0
6 1
0 1
110 10
1 1
6 0
15 10
14 100
12 2

【样例输出1】

3 114
1 10
1 1
1 2

【样例输入2】

1 2
10 2
20 2
12 1

【样例输出2】

1 3

#include<iostream>
#include<algorithm>
using namespace std;
struct Frog {
	int site;
	int length;
	int eat=0;
	int num;

};
struct Mos {
	int site;
	int weight;
	bool live=true;//活着的蚊子才能被吃
};
bool cmp1(Frog a,Frog b) {
	return a.site <b.site ;
}
bool cmp2(Frog a,Frog b) {
	return a.num <b.num ;
}
int main() {
	int n,m;//n青蛙,m蚊子
	cin>>n>>m;
	//输入青蛙
	Frog frog[n];
	for(int i=0; i<n; i++) {
		cin>>frog[i].site >>frog[i].length ;
		frog[i].num =i;
	}
	//输入蚊子

	Mos mos[m];
	for(int i=0; i<m; i++) {
		cin>>mos[i].site >>mos[i].weight ;
	}
	sort(frog,frog+n,cmp1);
	for(int a=0; a<m; a++) {
		for(int b=0; b<n; b++)
			if(frog[b].site +frog[b].length >=mos[a].site &&frog[b].site <=mos[a].site &&mos[a].live ) {
				frog[b].length +=mos[a].weight ;
				frog[b].eat ++;
				mos[a].live =false;
				a=-1;
				break;青蛙吃了蚊子,舌头增长,从0开始看有没有存活的蚊子可以吃
			}

	}
	sort(frog,frog+n,cmp2);
	for(int i=0; i<n; i++) {
		cout<<frog[i].eat <<" "<<frog[i].length <<endl;
	}
	return 0;

}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,一个简单的 C# 编程的卡ok点歌系统可以包括以下功能: 1. 歌曲列表:用户可以查看所有可选歌曲的列表。 2. 歌曲搜索:用户可以根据歌曲称或歌手称搜索歌曲。 3. 歌曲选择:用户可以选择一首歌曲来点播。 4. 歌曲播放:用户可以听到自己点播的歌曲。 5. 歌曲状态:用户可以查看当前正在播放的歌曲。 下面是一个简单的示例,您可以参考一下: 首先,我们需要创建一个为 "KaraokeSystem" 的 C# 控制台应用程序。在这个应用程序中,我们需要定义一个歌曲类 "Song",该类包括歌曲称、歌手、歌曲文件路径等属性。 ```csharp class Song { public string Name { get; set; } public string Singer { get; set; } public string FilePath { get; set; } } ``` 接下来,我们需要定义一个歌曲列表 "SongList",该列表包含所有可选的歌曲。可以在程序中直接定义这个列表,也可以从数据库或文件中读取。 ```csharp List<Song> SongList = new List<Song>() { new Song() { Name = "青花瓷", Singer = "周杰伦", FilePath = "C:\\Songs\\qhc.mp3" }, new Song() { Name = "夜曲", Singer = "周杰伦", FilePath = "C:\\Songs\\yq.mp3" }, new Song() { Name = "七里香", Singer = "周杰伦", FilePath = "C:\\Songs\\qlx.mp3" }, new Song() { Name = "告白气球", Singer = "周杰伦", FilePath = "C:\\Songs\\gbqq.mp3" }, new Song() { Name = "晴天", Singer = "周杰伦", FilePath = "C:\\Songs\\qt.mp3" }, }; ``` 接下来,我们需要定义一个函数来搜索歌曲。该函数接收一个字符串作为参数,表示用户输入的搜索关键字。函数会遍历 SongList 列表,找出所有字或歌手包含该关键字的歌曲,并将它们返回。 ```csharp List<Song> SearchSong(string keyword) { List<Song> result = new List<Song>(); foreach (Song song in SongList) { if (song.Name.Contains(keyword) || song.Singer.Contains(keyword)) { result.Add(song); } } return result; } ``` 接下来,我们需要定义一个函数来播放歌曲。该函数接收一个 Song 对象作为参数,表示要播放的歌曲。函数会调用 Windows Media Player 来播放歌曲。 ```csharp void PlaySong(Song song) { WMPLib.WindowsMediaPlayer wmp = new WMPLib.WindowsMediaPlayer(); wmp.URL = song.FilePath; wmp.controls.play(); } ``` 最后,我们需要在控制台中实现一个简单的用户界面,让用户可以选择操作。用户可以输入数字来选择操作,比如 "1" 表示查看歌曲列表,"2" 表示搜索歌曲,"3" 表示点播歌曲等等。 ```csharp static void Main(string[] args) { while (true) { Console.WriteLine("请选择操作:"); Console.WriteLine("1. 查看歌曲列表"); Console.WriteLine("2. 搜索歌曲"); Console.WriteLine("3. 点播歌曲"); Console.WriteLine("4. 查看当前播放歌曲"); string input = Console.ReadLine(); if (input == "1") { foreach (Song song in SongList) { Console.WriteLine(song.Name + " - " + song.Singer); } } else if (input == "2") { Console.WriteLine("请输入搜索关键字:"); string keyword = Console.ReadLine(); List<Song> result = SearchSong(keyword); foreach (Song song in result) { Console.WriteLine(song.Name + " - " + song.Singer); } } else if (input == "3") { Console.WriteLine("请输入歌曲称:"); string name = Console.ReadLine(); Song song = SongList.FirstOrDefault(s => s.Name == name); if (song == null) { Console.WriteLine("歌曲不存在!"); } else { Console.WriteLine("正在播放 " + song.Name + " - " + song.Singer); PlaySong(song); } } else if (input == "4") { // TODO: 查看当前播放歌曲 } else { Console.WriteLine("无效的操作!"); } } } ``` 这只是一个简单的示例,您可以根据您的需求来添加更多的功能和代码。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值