看不懂 求帮助!
2.简要描述:一个活动有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
参考答案: /*分析:
输入N个数,再输入N-1个数 9
3 7 7 7 7 5 6 6
先把这N-1个数字按从大到小排序
7 7 7 7 6 6 5 3
第一个人认识了7个人,除了主持人还剩6个,就当是认识最靠近他后面的6个。 这样,除去第一个人,后面认识的人就都减少了一个,变成:
7 6 6 6 5 5 4 3 再次排序
从第二个人,除了主持人和第一个,应该认识5个人,就当是认识最靠近他后面的5个 这样,出去这个人,后面认识的人就都减少了一个,变成 7 6 5 5 4 4 3 3
排序,想减,重复下去
如果最后出现了0,就说明有人说谎
如果排序后,当前认识的人和其后面的人数都是1了,那一个人都是主持人,也是maybe truth */
#include <stdio.h>
#include <stdlib.h>
int cmp(const void*a,const void*b)
{
return *(int *)b-*(int *)a;
}
int main()
{
int i,j,N,a[100];
while(scanf("%d",&N)!=EOF&&N)
{
for(i=0;i<N-1;i++)
scanf("%d",a+i);
for(i=0;i<N-1;i++)
{
qsort(a+i,(N-1-i),sizeof(int),cmp);
if(a[N-2]==0)
{
printf("Lie absolutely\n");
break;
}
else if(a[i]==1)
{
printf("Maybe truth\n");
break;
}
else
for(j=1;j<a[i];j++)
a[i+j]--;
}
}
return 0;
}