杭电2013复试上机真题

ps:题是别的地方copy过来的,代码是自己的

第一题:

输入一个数,代表要检测的例子的个数,每个例子中: 
输入两个时间(格式HH:MM:SS),前面时间减去后面时间,输出在时钟上显示的时间,格式一样,2位不够数字前面补零。

没看到原题,按24小时制算

#include<stdio.h>

int main(){
	int n;
	int h1,m1,s1;
	int h2,m2,s2;
	
	scanf("%d",&n);
	while(n--){
		scanf("%d:%d:%d",&h1,&m1,&s1); //被减数 
		scanf("%d:%d:%d",&h2,&m2,&s2); //减数 
		
		int rh,rm,rs;
		if(s1 - s2 < 0){
			m1--;
			rs = s1 + 60 - s2;
		}
		else{
			rs = s1 - s2;
		}
		
		if(m1 - m2 < 0){
			h1--;
			rm = m1 + 60 - m2;
		}
		else{
			rm = m1 - m2;
		}
		
		if(h1 - h2 < 0){//小时不够减,被减数默认为第二天时间 
			rh = h1 + 24 - h2;
		}
		else{
			rh = h1 - h2;
		}			
		printf("%02d:%02d:%02d\n",rh,rm,rs); 
	}	
	return 1;
}

第二题:

一个活动有N个人参加,一个主持人和N-1个普通参加者,其中所有的人都认识主持人,主持人也认识所有的人,主持人要求N-1个参加者说出他们在参加者中所认识的人数,如果A认识B,则B认识A,所以最少是会认识一个人,就是主持人,他们说出了自己所认识的人数后,需要判断他们中有没有人说谎。 

输入: 

第一行是N,N=0表示结束 

第二行是N-1个数字 

输出: 

Lie absolutely 或者 Maybe truth 

1 2 4 5 5 3

3 7 7 7 7 5 6 6 

两个测试例子中第一个是Lie absolutely,第二个是Maybe truth 

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;

bool cmp(int a,int b){
    return a > b;
}

int main(){
	int nums;
	scanf("%d",&nums);
	while(nums != 0){
		int* a;
		a = (int*)malloc(sizeof(int)*(nums - 1));
		for(int i = 0;i < nums - 1;i++){
			scanf("%d",(a + i));
			*(a + i) -= 1; //手动除去主持人 
		}
		sort(a,a + nums - 1,cmp);
		
		//以 5 5 4 3 2 1 举例子,把每个人看成一个无向图中的结点,每个结点的度代表这个结点认识的人,很明显第一个结点的度不可能大于5,而等于五说明他认识其余所有人
		//当第一个人为5时,就说明其余人至少为1,而判断第二人时,除去认识第一个人,他还认识4个人,就说明后边的其余的人至少为2,这与已知条件不符,所以有人说谎了
		
		int flag = 0;
		for(int i = 0;i < nums - 2;i++){
			for(int j = 0;j < *(a + i);j++){
				a[i + 1 + j]--;
				if(a[i + 1 + j] < 0){
					flag = 1;
					break;
				}
			}
			if(flag){
				printf("Lie absolutely\n");
				break;
			}
		}
		
		if(!flag){
			printf("Maybe truth\n");
		} 				
		scanf("%d",&nums);
	} 
	return 1;
}

猜你喜欢

转载自blog.csdn.net/jh8w8m/article/details/87521477