大整数的排序输出

宇宙总统洛谷P1781

描述: 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。

输入输出格式

输入格式:president.in

第一行为一个整数n,代表竞选总统的人数。

接下来有n行,分别为第一个候选人到第n个候选人的票数。

输出格式: president.out

共两行,第一行是一个整数m,为当上总统的人的号数。

第二行是当上总统的人的选票。

要点1、
       这道题由于票数巨大,可以用字符串保存,即大整数用字符串来表示。比较过程如下:一个个比,比一个丢一个,设置一个变量记当前大票的候选人号。
(1)比较位数,位数大的得票高,即首先找出位数最多的那几个数;
(2)位数相同,从最高位开始比较,大的为得票高,即在位数相同的几个数中,先找到最高位大的那几个;
(3)在 数相同,最高位相同的情况下,比较次高位,如此循环到底。

要点2、
      可构造一个结构体来解决这件事,{票数tk,票数位数len,竞选人编号i},语法如下:

struct  Elect{  char  tk[ 105 ]; // 结构体a[i]的成员 tk表票数,这里用字符串存入;
int  len,num; // 结构体a[i]的成员 len表票数的数字位数; 结构体a[i]的成员 num:竞选人编号
}a[maxn ]; //定义结构体a[i],maxn可以在头部定义,方便修改。

要点3、
然后c++中自带sort函数,调 #include 语法描述为:
sort(begin,end),表示一个范围,
例子:
#include 
int main()
{
 int a[20]={2,4,1,23,5,76,0,43,24,65},i;
 for(i=0;i<20;i++)
  cout< 
    
 
    
 
    
还有一种方法是自己编写一个比较函数来实现,即接着调用三个参数的sort,语法是sort(begin,end,compare)就成了。
自己编写compare函数:
bool compare(int a,int b)
{
  return ab,则为降序
}#include 
int main()
{
  int a[20]={2,4,1,23,5,76,0,43,24,65},i;
  for(i=0;i<20;i++)
  cout< 
    
 
    
这里我们用降序,这样结构体a(1)中存的就是最大的得票了和位置数了。
 
    
完整程序如下:
#include
#include
#include
#include
using namespace std;
int n;//竞选人数 
struct Elect{
    char tk[105];//tk:票数,这里用字符串存入 
    int len,num;//len:票数的数字位数;num:竞选人编号 
}a[25];//这里用一下结构体, 
bool cmp(Elect x,Elect y)//比较函数是重点 
{
    if(x.len>y.len)
        return 1; 降序
    if(x.lenreturn 0;//先比数位多少 
    if(strcmp(x.tk,y.tk)>0)
        return 1;//如果数为相同的话还要比较数字大小 
    return 0;
 } 
int main()
{
    cin>>n;读候选总统人数;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].tk;//一个个读入总统的票数 
        a[i].len=strlen(a[i].tk);//计算票数的长度
        a[i].num=i;//记录总统的位置数。 
    }
    sort(a+1,a+n+1,cmp);//进行排序,sort函数需调用algorithm库 
    cout<1].num<<endl;//因为是降序所以结构体第一个就是最高得票总统
    cout<1].tk<<endl;//puts(a[1].tk);//进行输出 
    return 0;
}
 
   

你可能感兴趣的:(NOI算法积累)