胡凡 《算法笔记》 上机实战训练指南 chap3 入门模拟: 3.2 查找元素

Posted 临风而眠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了胡凡 《算法笔记》 上机实战训练指南 chap3 入门模拟: 3.2 查找元素相关的知识,希望对你有一定的参考价值。

胡凡 《算法笔记》 上机实战训练指南 chap3 入门模拟: 3.2 查找元素

文章目录

【PAT B1041】考试座位号

  • 【PAT B1041】考试座位号

  • 难蚌 , long long的输出应该写成%lld ,一开始写成%d 卡了很久

    #include <iostream>
    using namespace std;
    typedef struct student
    
        long long examnum;
        int testnum;
        int chairnum;
     stu;
    stu s[1010];
    // stu s[1010];
    int N, M;
    int m[1010];
    int main()
    
        int en, tn, cn;
    
        cin >> N;
        for (int i = 1; i <= N; i++)
        
            // cin >> en >> tn >> cn;
            // s[i].examnum = en;
            // s[i].testnum = tn;
            // s[i].chairnum = cn;
            cin >> s[i].examnum >> s[i].testnum >> s[i].chairnum;
        
        cin >> M;
        for (int i = 1; i <= M; i++)
        
            cin >> m[i];
            for (int j = 1; j <= N; j++)
            
                if (m[i] == s[j].testnum)
                
                    printf("%lld %d\\n", s[j].examnum, s[j].chairnum);
                
            
        
    
    

【PAT B1004】成绩排名

  • 【PAT B1004】成绩排名

  • AC代码

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n;
    struct Student
      char name[12];
      char num[12];
      int score;
      bool operator < (const Student &S)const
      
          return this->score > S.score;
      
      
    ;
    bool max_cmp(Student S1, Student S2)
    
        return S1.score > S2.score;
    
    struct Student s[1000];
    int main()
    
        cin >> n;
        for(int i = 1; i <= n ; i ++ )
        
            cin >> s[i].name >> s[i].num >> s[i].score;
        
        
        sort(s+1,s+1+n,max_cmp);
        cout << s[1].name << " " << s[1].num << endl;
        cout << s[n].name << " " << s[n].num << endl;
        
    
    

【PAT B1028】人口普查

解决过程(cpp)

  • 首先这个日期我一开始的想法是 作为int的话,怎么拼凑成一个大数呢

    2001/05/12 → 20010512 ,

    过程是2001x1000+05x100+12x1,主要是05这种不好直接搞,或者写if条件,那就有点麻烦了

    于是写到这里的时候我犹豫了

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <algorithm>
    using namespace std;
    
    int N;
    
    typedef struct Person
        char name[5];
    //   string date;  想了想感觉不合理,还得拆分字符串转为数字
        int year;
        int month;
        int day;
    Person;
    
    Person P[100010];
    int valid; //有效生日个数
    
    int main()
    
        cin >> N;
        for(int i = 0; i < N; i++)
        
            cin >> P[i].name;
            cin >> P[i].year >> "/" >> P[i].month >> "/" >> P[i].day;
        
        //把出生日看成一个大数字2001/05/12 -> 20010512
        //今天:20140906
        //那我不如拼接字符串???
        
        return 0;
    
    

    那我能不能看成字符串,把里面的/去掉,拼凑成字符串"20010512",再转换为数字

    试试这样子:👇

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() 
        string date = "2001/05/12";
        // Replace '/' characters with empty strings
        date.erase(remove(date.begin(), date.end(), '/'), date.end());
    
        // Convert the resulting string to a number
        int num = stoi(date);
        cout << num << endl; // 20010512
    
        return 0;
    
    
    
  • 于是我一口气写到了这一步

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    int N;
    
    typedef struct Person
    //     char name[5];
        string name;
        int date;
    Person;
    
    Person P[100010];
    int valid; //有效生日个数
    
    int main()
    
        cin >> N;
        string tempdate;
        string tempName;
        int dateNumTemp;
        int index = 0;
        for(int i = 0; i < N; i++)
        
            cin >> tempName;
            cin >> tempdate;
            tempdate = tempdate.erase(remove(data.begin(),data.end(),'/'),data.end());
            dateNumTemp = stoi(tempdate);
            if(20140906<=dateNumTemp<=22140906)
            
                P[index].name = tempName;
                P[index].date = dateNumTemp;
                index += 1
                
        
        
        //把出生日看成一个大数字2001/05/12 -> 20010512
        //今天:20140906
        //那我不如拼接字符串???
        for(int j = 0; j < index; j++)
            
         
        cout << index
        
        return 0;
    
    

    突然发现忘记结构体如何使用sort了

  • 想起来之后补充上去

    同时发现了那个错误 tempdate = tempdate.erase(remove(data.begin(),data.end(),'/'),data.end());

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    int N;
    
    typedef struct Person
    //     char name[5];
        string name;
        int date;
    Person;
    
    Person P[100010];
    
    bool cmp(Person a, Person b) 
        return a.date < b.date;
    
    int main()
    
        cin >> N;
        string tempdate;
        string tempName;
        int dateNumTemp;
        int index = 0;
        for(int i = 0; i < N; i++)
        
            cin >> tempName;
            cin >> tempdate;
    //      错误写法...赋值...不需要   tempdate = tempdate.erase(remove(tempdate.begin(),tempdate.end(),'/'),tempdate.end());
            tempdate.erase(remove(tempdate.begin(),tempdate.end(),'/'),tempdate.end());
            dateNumTemp = stoi(tempdate);
            if(20140906<=dateNumTemp && dateNumTemp <=22140906)
            
                P[index].name = tempName;
                P[index].date = dateNumTemp;
                index += 1;
            
                
        
        
        sort(P,P+index,cmp);
        cout << index << P[0].name << P[index-1].name;
        
        return 0;
    
    
    • 突然发现没加空格… cout << index << P[0].name << P[index-1].name

      改了之后,居然还是一个测试样例都没过…

    • 突然发现了一个很大的问题! 这样子作为限定条件的话, 输入的日期可以有13月41号,14月39号这种,

      但这个问题应该不是主要矛盾,先自己测试测试

      不是问题,因为题目里面说了“这里确保每个输入的日期都是合法的”

    • 测试了一下代码,确实是错误地

    • 然后感觉很奇怪…加了一些测试

      #include <iostream>
      #include <cstdio>
      #include <cstdlib>
      #include <string>
      #include <algorithm>
      using namespace std;
      
      int N;
      
      typedef struct Person
      //     char name[5];
          string name;
          int date;
      Person;
      
      Person P[100010];
      
      bool cmp(Person a, Person b) 
          return a.date < b.date;
      
      int main()
      
          cin >> N;
          string tempdate;
          string tempName;
          int dateNumTemp;
          int index = 0;
          for(int i = 0; i < N; i++)
          
              cin >> tempName;
              cin >> tempdate;        tempdate.erase(remove(tempdate.begin(),tempdate.end(),'/'),tempdate.end());
              dateNumTemp = stoi(tempdate);
              printf("%d\\n",dateNumTemp); 
              printf("----------\\n");
              if(20140906<=dateNumTemp && dateNumTemp <=22140906)
              
                  P[index].name = tempName;
                  cout << P[index].name << endl;
                  P[index].date = dateNumTemp;
                  printf("%d\\n",P[index].date); 
                  index += 1;
              
                  
          
          
          sort(P,P+index,cmp);
          cout << index << " " << P[0].name << " " << P[index-1].name;
          
          return 0;
      
      

stoi需要C++11,在vscode里面暂时没有学如何去配置,就先用dev c++来跑了

  • 突然发现,🤣,日期那里搞错咯,应该往前面推两百岁,而不是往未来🤣🤣🤣

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    int N;
    
    typedef struct Person
    //     char name[5];
        string name;
        int date;
    Person;
    
    Person P[100010];
    
    bool cmp(Person a, Person b) 
        return a.date < b.date;
    
    int main()
    
        cin >> N;
        string tempdate;
        string tempName;
        int dateNumTemp;
        int index = 0;
        for(int i = 0; i < N; i++)
        
            cin >> tempName;
            cin >> tempdate;
    
            tempdate.erase(remove(tempdate.begin(),tempdate.end(),'/'),tempdate.end());
            dateNumTemp = stoi(tempdate);
            if(18140906<=dateNumTemp && dateNumTemp <=20140906)
            
                P[index].name = tempName;
                P[index].date = dateNumTemp;
                index += 1;
            
                
        
        
        sort(P,P+index,cmp);
        cout << index << " " << P[0].name << " " << P[index-1].name;
        
        return 0;
    
    

    这个时候,看起来是对了的

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IOd779Pi-1673287468238)(null)]

    However…

AC代码

  • 经过大佬指点,知道错的地方在哪了

    • 但是有可能过滤完了合法的人是0个

      如果全过滤掉了,那么index为0, P[-1].name就错了, P[0].name 没有输入内容

  • AC代码

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    int N;
    
    typedef struct Person
    //     char name[5];
        string name;
        int date;
    Person;
    
    Person P[100010];
    
    bool cmp(Person a, Person b) 
        return a.date < b.date;
    
    int main()
    
        cin >> N;
        string tempdate;
        string tempName;
        int dateNumTemp;
        int index = 0;
        for(int i = 0; i < N; i++)
        
            cin >> tempName;
            cin >> tempdate;
    
            tempdate.erase(remove(tempdate.begin(),tempdate.end(),'/'),tempdate.end());
            dateNumTemp = stoi(tempdate);
            if(18140906<=dateNumTemp && dateNumTemp <=20140906)
            
                P[index].name = tempName;
                P[index].date = dateNumTemp;
                index += 1;
            
                
        
        
        sort(P,P+index,cmp);
        cout << index << " " << P[0].name << " " << P[index-1].name;
        
        return 0;
    
    

感觉我的比书上的做法更好(

书上是套了好多if else

erase和remove是如何工作的:

remove是改变了元素的顺序,erase才是真的删除

python实现

AC代码

pycode1

错误代码

import sys

N = int(sys.stdin.readline())

P = []

for i in range(N):
	temp = sys.stdin.readline().split()
	tempName = temp[0]
	tempDate = temp[1]
	dateNumTemp = int(tempDate.replace('/',''))
	if 18140906<=dateNumTemp and dateNumTemp <=20140906:
		P.append([tempName,dateNumTemp])

P.sort(key=lambda x:x[1])

print(len以上是关于胡凡 《算法笔记》 上机实战训练指南 chap3 入门模拟: 3.2 查找元素的主要内容,如果未能解决你的问题,请参考以下文章

《R语言实战》自学笔记5-数据框

Cassandra实战 笔记-《Cassandra内部数据存储结构》

《R语言实战》自学笔记41-生成频数表

《R语言实战》自学笔记69-重抽样和自助法

《R语言实战》自学笔记71-主成分和因子分析

[code] PTA 胡凡算法笔记 DAY054