科大讯飞 2017在线笔试编程题

科大讯飞在线笔试技术综合类方向:java和C++方向,编程题3*20=60分

第一道:吵架问题//20分

题目描述:

有 n 个人排成了一行队列,每个人都有一个站立的方向:面向左或面向右。由于这 n 个人中每个人都很讨厌其他的人,所以当两个人面对面站立时,他们会发生争吵,然后其中一个人就会被踢出队列,谁被踢出队列都是有可能的。

 

我们用字符 L 来表示一个面向左站立的人,用字符 R 来表示一个面向右站立的人,那么这个队列可以用一个字符串描述。比如 RLLR 就表示一个四个人的队列,其中第一个人和第二个人是面对面站立的。他们发生争吵后队列可能会变成 LLR,也可能变成 RLR;若变成 RLR,则第一个人与第二个人还会发生争吵,队列会进一步变成 LR 或者 RR。

 

若在某个时刻同时可能有很多的争吵会发生时,接下来只会发生其中的一个,且任意一个都是有可能发生的。

 

你想知道经过一系列的争吵后,这个队列最少会剩下多少人?

输入

第一行包含一个有字符 L 和 R 构成的字符串。

1 ≤字符串长度≤ 105

样例输入

LRRLRL

样例输出

2


Hint

一种可能的变化情况是:LRRLRL -> LRLRL -> LRRL -> LRL -> LR


思路:

R在左,L在右,相邻则消去任意一个,按样题输出则是间断性的消去R和L,最后剩下的字母个数即为输出


代码如下:

但运行结果不对,求路过大神解答

 
  
#include 
#include 

int main()
{
	char str[10];
	int i = 1;
	int n,j,Num_Remain;
	
	printf("Please Enter: \n");
	gets(str);
	//printf("%s\n",str);
	Num_Remain = strlen(str);
	
	for(n = 0;str[n] != '\0';n++)  
	{
		if((str[n] == 'R') && (str[n++] == 'L'))
		{
			
			if( i%2 )
			{
				i++;
				for(j = n;str[j] != '\0';j++)
					str[j] = str[j++];
				Num_Remain--;
				printf("%d",Num_Remain);
				n--;
			}
			
			else
			{
				i++;
				for(j = n + 1;str[j] != '\0';j++)
					str[j] = str[j++];
				Num_Remain--;
				n--;
			}
		}
	}
	
	printf("%d",Num_Remain);
	return 0; 
} 


第二道:球赛 //20分

题目描述:

大学生足协决定举办全国性的大学生足球赛,由每个学校派遣一支队伍代表该校参赛。比赛分区分为几个赛区进行,最终的总决赛中,将有不超过n支队伍参加。经过激烈的角逐,有机会参与总决赛的队伍已经决出。

 

协会对比赛的规则进行了调整,以便使得比赛更具有观赏性。

1. 总决赛的参赛队伍为n支,n为偶数;

2. 进入前1/2的队伍才有资格进入淘汰赛;

3. 队伍按积分排名,具体规则为:胜一场积3分;平一场积1分;负一场积0分。队伍首先按积分降序排列,积分相同按净胜球数降序排列,仍然相同的按进球数降序排列。

4. 基于上述规则,尚未出现有排名歧义的情况发生。

 

随着赛程的进行,目前各个队伍对战的结果已经确定了,小B负责确定进入淘汰赛的名单,她向你求助,你能帮她吗?


输入

测试数据有多组,每组测试数据的第一行为一个整数n(1=< n <=50),为参与总决赛的球队数,随后的n行为球队的名字,由不超过30个的大小写拉丁字母构成。随后的n*(n-1)/2行为赛事的开展情况,每行的格式为name1-name2 num1:num2,表示两支队伍的比分情况(0=

样例输入

4

A

B

C

D

A-B 1:1

A-C 2:2

A-D 1:0

B-C 1:0

B-D 0:3

C-D 0:3

2

a

A

a-A 2:1

样例输出

A

D

a

代码来自赛马网,本地编译运行正确,赛马正确率为0~~仅供参考

代码如下:

#include
#include
#include
#include
#include

using namespace std;

bool myComp(const vector& a, const vector& b){
	if(a[1]>b[1])
		return true;
	else if(a[1]b[2])
		return true;
	else if(a[2]b[3])
		return true;
	else if(a[3]>n){
		vector names;
		vector> datas;
		for(int i = 0; i < n; i++){
			vector t;
			for(int j = 0; j < 4; j++){
				t.push_back(0);
			}
			datas.push_back(t);
		}
		for(int i = 0; i < n; i++){
			datas[i][0] = i;
		}
		for(int i = 0; i < n; i++){
			string t;
			cin>>t;
			names.push_back(t);
		}
		for(int i = 0; i < n*(n-1)/2; i++){
			string t;
			cin>>t;
			int ind = t.find('-');
			string name1 = t.substr(0,ind);
			string name2 = t.substr(ind+1,t.size()-ind-1);
			auto iter = find(names.begin(),names.end(),name1);            
			int team1 = iter-names.begin();
			iter = find(names.begin(),names.end(),name2);            
			int team2 = iter-names.begin();
			cin>>t;
			ind = t.find(':');
			string s1 = t.substr(0,ind);
			string s2 = t.substr(ind+1,t.size()-ind-1);
			int score1 = atoi(s1.c_str());
			int score2 = atoi(s2.c_str());
			if(score1 > score2){
				datas[team1][1] += 3;
			}
			else if(score1 == score2){
				datas[team1][1] += 1;
				datas[team2][1] += 1;
			}
			else{
				datas[team2][1] += 3;
			}
			datas[team1][2] += (score1-score2)>0?(score1-score2):0;
			datas[team2][2] += (score2-score1)>0?(score2-score1):0;
			datas[team1][3] += score1;
			datas[team2][3] += score2;   
		}
		sort(datas.begin(), datas.end(), myComp);
		vector res;
		for(int i = 0; i < n/2; i++){
			int team = datas[i][0];
			res.push_back(team);
		}
		sort(res.begin(), res.end());

		for(int i = 0; i < n/2; i++){            
			cout<



第三道:选课冲突问题  //20分

题目描述:

小明是一名学生,又到了学校的选课时间,他想选一些课程学习,已知课程开课时间都在每周一到周五之内,早上4讲课,下午4讲课,晚上2讲课。

小明担心选课时间上有所冲突。所以他希望可以对课程时间进行检查。

输入

首先输入一个整数n(0

之后输入n行选课信息,每行选课信息有2个数字。

第一个数字表示开课时间,开课时间用2位数表示,前一位用0到4表示周一至周五,后一位用0到9表示从早到晚顺序第几讲课,如12表示礼拜二第三讲课。01表示礼拜一第二讲课。

每行第二个数字表示课程代码,如:204521。课程代码为6位数字。输入课程代码均不重复。

样例输入

5

01 204521

23 204523

22 204526

01 204528

22 204527

样例输出

01 204521 204528

22 204526 204527

Hint

Input Sample 2
3
11 204521
23 204522
43 204531

Output Sample 2
YES

代码如下:

来自赛马网,仅供参考
#include
#include
#include
using namespace std;
struct stru{
	string str;
	int course;
	int flag;//是否重复标记
	int fl;//是否已输出标记
};
int main()
{
	stru arr[100];
	int n;
	cin>>n;
	int i,j;
	for(i=0;i>arr[i].str>>arr[i].course;
		arr[i].flag=0;
		arr[i].fl=0;
	}
	int count=0;
	for(i=0;i

本人太菜,C语言还在初学者阶段,还需努力~~~

你可能感兴趣的:(C/C++,算法,笔试面试工作)