杭电复试2013题目解答

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

/*
#include<cstdio> 

int main(){
	int hh,mm,ss;
	int hh2,mm2,ss2;
//	int temph,tempm,temps;
	int T;
	scanf("%d",&T);
	while(T--){
	scanf("%d%d%d",&hh,&mm,&ss);
	scanf("%d%d%d",&hh2,&mm2,&ss2);
	if(ss<ss2){
		mm=mm-1;
		ss=ss+60;
	}
	if(mm<mm2){
		hh=hh-1;
		mm=mm+60;
	} 
	printf("%02d:%02d:%02d\n",hh-hh2,mm-mm2,ss-ss2);
	}
	return 0;
}

*/

/简要描述:一个活动有 N(1<N<100)个人参加,一个主持人和 N-1 个普通
参加者,其中所有的人都认识主持人,主持人也认识所有的人,主持人要求 N-1
个参加者说出他们在参加者中所认识的人数,如果 A 认识 B,则 B 认识 A,所以最
少是会认识一个人,就是主持人,他们说出了自己所认识的人数后,需要判断他
们中有没有人说谎。
输入:
第一行是 N,N=0 表示结束
第二行是 N-1 个数字
输出:
Lie absolutely 或者 maybe truth
7
1 2 4 5 5 3
9
3 7 7 7 7 5 6 6
两个测试例子中第一个是 lie,第二个是 truth
7 7 7 7 6 653
76665543
76554433
76543332
76542222
76542221
76542211
//
554321
543211
542101//这里不应该出现0 ,因为最少认识一个主持人
5421-1
/
//可以将数据由大到小排序,这样可以减少次数,因为大的数据在前的话一次能减小好多数
//一个人如果认识4个人,那么除了主持人将有3个数要减去1,这样最后得到的数应该是至少为1,因为都认识主持人

#include<cstdio>
#include<algorithm>

using namespace std;

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

int main(){
	int n;
	int num[100];//存储n-1个人
	while(scanf("%d",&n)!=EOF,n){//输入n=0结束 
		for(int i=0;i<n-1;i++){
			scanf("%d",&num[i]);
		} 
		bool flag=0;
		for(int i=0;i<n-2;i++){//n-1个人只需要n-2次操作 
			sort(num,num+n-1,cmp);//将数据从大到小排序 554321
			for(int j=1;j<=num[i]-1;j++){ //从num[i+1]到num[i+num[i]-1] 都减1 
					num[i+j]--;            //543211
			}
			for(int j=n-2;j>=0;j--){//遍历数组,如果有一个为0,那么就是说谎直接退出循环 
				if(num[j]==0) {
					printf("Lie absolutely\n"); 
					flag=1;
					break;
				}
			}
			if(flag==1) break;//退出外层for循环
		}
		if(flag==0) printf("maybe truth\n");//n-2个数都操作完没有发现0存在 
		
	} 
	return 0;
} 
发布了23 篇原创文章 · 获赞 62 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42264284/article/details/105613080
今日推荐