看不懂 求帮助!

jack___coder 2014-03-28 11:29:20
  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; 
}
...全文
84 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobo928843007 2014-03-29
  • 打赏
  • 举报
回复
这里一个关键的条件就是所有人都认识主持人,也就是他们认识的人 >=1人,所有他们把认识的人呢一个一个的去掉以后最终的值是>=1,不会等于0,出现0说明有人说谎。我觉得也会出现有人说谎但却不出现0的情况,比如A说谎,多加了一个;而B也说谎,也多加了一个。
bobo928843007 2014-03-29
  • 打赏
  • 举报
回复
你是看不懂算法还是程序?

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧