【洛谷p1781】宇宙总统

宇宙总统【题目链接】

关于题目算法,其实就是考排序,那我们直接sort不就好啦,显然不能。

这个题让我重新认识了cmp函数;


 

以下是我的心路历程:

看到这个题,嗯?这么简单的吗,我直接sort不就好啦✿✿ヽ(°▽°)ノ✿

再看一眼,不会这么简单的吧(⊙▽⊙)#

往下一看:(微笑)


 

废话 is over

MY SOLUTION:

这个题其实开始是想手写高精度排序的,好像手写排序也不是特别难?然后在讨论版发现了一个用sort的算法,于是我也就用sort做啦,然后成功对sort函数中的cmp有了新的认识:

  1. 首先当然是读入啦,结构体读入,方便排序;
  2. 然后sort(p+1,p+n+1,cmp)
  3. 接下来就是响当当的cmp函数啦:
    1. 首先这让人忍不住想起了【6.12校内test】T3 城市交通费中的cmp:
      int cmp(int x,int y)
      {
          return p[x]<p[y];
      }

      内心os:还可以这么玩qwq(这里是给出两个下标x,y,按它们的繁华度从小到大排序)

    2. 从网上并没有找到有关cmp是怎么用的,只找到一句话:cmp函数的含义:如果返回值是 True,表示 要把 序列 (X,Y),X放Y前。(这是我感觉唯一有用的qwq)对于这种:
      bool cmp(int x,int y){
              return x>y;
      }

      的cmp,其实就是比较x与y如果x>y return 1;否则 return 0;

    3. 那么按照这个思想,我们可以开始编写我们的cmp了:首先求这两个字符串的长度(因为我用的char型所以是用strlen(n))比较两个串的长度,如果strlen(x)>strlen(y)(但是好像不能直接写if(strlen(x)>strlen(y)))return 1;表示把x放在y前,反之return 0;然后当这两个字符串长度相同时,我们运用一个神奇的函数strcmp——字符串比较函数;strcmp(字符串1,字符串2) 如果字符串1>字符串2,会返回一个大于0的数,如果字符串1<字符串2,会返回一个小于0的数,如果字符串1=字符串2,返回0;因此我们可以写完程序啦(不想解释啦我相信后面是很好理解的)

CODE:

#include<bits/stdc++.h>
#include<string>
#include<algorithm>

using namespace std;

int n;
struct node{
    int num;
    char a[100];
}p[21];

bool cmp(node x,node y){
    int xx=strlen(x.a),yy=strlen(y.a);
    if(xx>yy) return 1;
    if(xx<yy) return 0;
    if(strcmp(x.a,y.a)<0) return 0;
    return 1;
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      cin>>p[i].a,p[i].num=i;
    sort(p+1,p+n+1,cmp);
    cout<<p[1].num<<endl<<p[1].a<<endl;
}

 想手写一个字符串比较函数qwq

算了懒死啦(主要没有搞明白传值调用和传址调用然后不会写)

posted @ 2019-06-13 15:24  Sweetness  阅读(524)  评论(0编辑  收藏  举报