二分贪心—X

来源:互联网 发布:客户端怎么连接数据库 编辑:程序博客网 时间:2024/06/15 07:26

题目:输入n和m,n代表n次比赛,m代表个人成绩,输出出现次数第二多的所有人。

解题思路:定义一个结构体,结构体包含两个数,一个数表示标号,另一个数表示出现的个数,然后结构体数组进行排列,输出出现个数第二多的数即可。

细节处理:用scanf和printf,用cin和cout会超时。

代码:#include<iostream>
#include <stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct A
{ int num;
  int s;
}a[250000];
bool cmp(A a,A b)
{
if(a.s!=b.s)
    return a.s>b.s;
  else return a.num<b.num;
}
int main()
{ int i,j,n,m,b,h;
  while(scanf("%d%d",&n,&m))
  {
      if(n==0&&m==0)
      break;
      A a[250000];
    memset(a,0,sizeof(a));
   for(i=0;i<n;++i)
    for(j=0;j<m;++j)
    {
 scanf("%d",&b);
 a[b].num=b;
 a[b].s++;
    }
    sort(a,a+250000,cmp);


    for(i=1,h=-1;i<m*n;++i)
     { if(h>a[i].s)
        break;
 if(a[i].s!=a[0].s)
      { h=a[i].s;
       printf("%d ",a[i].num);
 }
    }
    printf("\n");
  }
}

感想:写代码的时候要灵活,比如这个题的输入和输出,用scanf和printf可以过,但用cin和cout就不行。

0 0
原创粉丝点击