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

news2025/1/21 0:47:57

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

文章目录

  • 胡凡 《算法笔记》 上机实战训练指南 chap3 入门模拟: 3.2 查找元素
  • 【PAT B1041】考试座位号
  • 【PAT B1004】成绩排名
  • 【PAT B1028】人口普查
    • 解决过程(cpp)
      • AC代码
    • python实现
      • AC代码
        • pycode1
        • pycode2
      • 未AC代码
        • pycode3原因超时
        • pycode4原因还是超时
  • 【PAT A1011】World Cup Betting
    • 梳理一下题意
    • 开始写代码
        • 一次性AC
    • 去看看别人的代码,感觉自己🤣 杀鸡焉用牛刀
  • 【PAT A1006】Sign In and Sign Out
    • AC 还是用前面用到的erase&remove
    • 乐,再次感叹杀鸡焉用牛刀....🤣🤣🤣🤣🤣
      • 书上的做法也值得学习一下
        • 要注意这个问题
        • 一个遗留问题
    • 用python玩玩
      • AC代码1 input()
      • AC代码2 sys
  • 【PAT A1036】Boys VS Girls
    • AC
    • 还是学习一下书上的代码

【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】人口普查

  • 【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号这种,

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

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

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

    image-20230109155137939

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

      #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;
      }
      

      image-20230109161219785

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…

    image-20230109161518124

AC代码

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

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

      image-20230109174118755

      如果全过滤掉了,那么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

image-20230109180756162

erase和remove是如何工作的:

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

  • C++ 中 remove 与 erase 的理解
  • https://juejin.cn/post/6844903817734160391
  • c++ string的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(P),P[0][0],P[-1][0])
image-20230109162257501

加上len的判断就AC啦

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])
if len(P) == 0:
    print(0)
else:
    print(len(P),P[0][0],P[-1][0])

pycode2

这个错误应该是input导致的非零返回

def find_youngest_oldest():

    # Read N and create a list of Person objects
    N = int(input())
    person_list = []
    for i in range(N):
        name = input()
        birthday = input().replace('/', '')
        date_num = int(birthday)
        if 18140906 <= date_num and date_num <= 20140906:
            person_list.append((name, date_num))

    # Sort the list by birthday
    person_list.sort(key=lambda x: x[1])

    # Print the number of valid birthdays, and the name of the youngest and oldest person
    print(len(person_list), person_list[0][0], person_list[-1][0])


find_youngest_oldest()
image-20230109164611257

下面这个AC了

import sys
def find_youngest_oldest():

    # Read N and create a list of Person objects
    N = int(sys.stdin.readline())
    person_list = []
    for i in range(N):
        name,birthday = sys.stdin.readline().split()
#         name = input()
        birthday = birthday.replace('/', '')
        date_num = int(birthday)
        if 18140906 <= date_num and date_num <= 20140906:
            person_list.append((name, date_num))

    # Sort the list by birthday
    person_list.sort(key=lambda x: x[1])
    if len(person_list)==0:
        print(0)
    # Print the number of valid birthdays, and the name of the youngest and oldest person
    else:
        print(len(person_list), person_list[0][0], person_list[-1][0])


find_youngest_oldest()
image-20230109220309198

未AC代码

pycode3原因超时

import sys
import datetime

class Person:
    def __init__(self, name, birthday):
        self.name = name
        self.birthday = datetime.datetime.strptime(birthday, '%Y/%m/%d')

def find_youngest_oldest():
    # Read N and create a list of Person objects
    N = int(sys.stdin.readline())
    person_list = []
    for i in range(N):
        name, birthday = sys.stdin.readline().split()
        person_list.append(Person(name, birthday))

    # Sort the list by birthday
    person_list.sort(key=lambda x: x.birthday)

    # Filter out invalid birthdays (less than 200 years ago or in the future)
    today = datetime.datetime(2014, 9, 6)
    two_hundred_years_ago = datetime.datetime(1814, 9, 6)
#     two_hundred_years_ago = today - datetime.timedelta(days=365*200)
    valid_people = [p for p in person_list if p.birthday < today and p.birthday > two_hundred_years_ago]

    # Print the number of valid birthdays, and the name of the youngest and oldest person
    print(len(valid_people), valid_people[0].name, valid_people[-1].name)

# Test the function
find_youngest_oldest()

image-20230109163204438
  • 发现了两个错误,非零返回应该是前面那个len为0时,数组下标越界导致的?…

    于是加上len为0时的分支, 还有个错误就是 应该是闭区间 而不是开区间,改成<=和>=

    valid_people = [p for p in person_list if p.birthday <= today and p.birthday >= two_hundred_years_ago]

    import sys
    import datetime
    
    class Person:
        def __init__(self, name, birthday):
            self.name = name
            self.birthday = datetime.datetime.strptime(birthday, '%Y/%m/%d')
    
    def find_youngest_oldest():
        # Read N and create a list of Person objects
        N = int(sys.stdin.readline())
        person_list = []
        for i in range(N):
            name, birthday = sys.stdin.readline().split()
            person_list.append(Person(name, birthday))
    
        # Sort the list by birthday
        person_list.sort(key=lambda x: x.birthday)
    
        # Filter out invalid birthdays (less than 200 years ago or in the future)
        today = datetime.datetime(2014, 9, 6)
        two_hundred_years_ago = datetime.datetime(1814, 9, 6)
    #     two_hundred_years_ago = today - datetime.timedelta(days=365*200)
        valid_people = [p for p in person_list if p.birthday <= today and p.birthday >= two_hundred_years_ago]
        # Print the number of valid birthdays, and the name of the youngest and oldest person
        if len(valid_people)==0:
            print(0)
        else:
            print(len(valid_people), valid_people[0].name, valid_people[-1].name)
    
    # Test the function
    find_youngest_oldest()
    
    
    image-20230109211542110

    emm, python确实慢,最后一个不知道该咋解决了

    • 类的实例化那一步写成这个也行

              p = Person(name,birthday)
              person_list.append(p)
      

pycode4原因还是超时

  • 想到了力扣上的一些代码风格

    噢对,如果没有import sys 会显示五个非零返回…

    import datetime
    from collections import deque
    from typing import List
    import sys
    
    class Person:
        def __init__(self, name: str, birthday: str) -> None:
            self.name = name
            self.birthday = datetime.datetime.strptime(birthday, '%Y/%m/%d')
    
    def find_youngest_oldest(N: int, people: List[Person]) -> None:
        # Sort the list of Person objects by birthday using quicksort
        people.sort(key=lambda x: x.birthday)
    
        # Use a deque to store the valid people
        today = datetime.datetime(2014, 9, 6)
        two_hundred_years_ago = datetime.datetime(1814, 9, 6)
        valid_people = deque()
    
        # Iterate through the list of people and add the valid ones to the deque
        for person in people:
            if person.birthday <= today and person.birthday >= two_hundred_years_ago:
                valid_people.append(person)
        if len(valid_people)==0:
            print(0)
        # Print the number of valid birthdays, and the name of the youngest and oldest person
        else:
            print(len(valid_people), valid_people[0].name, valid_people[-1].name)
    
    # Test the function
    N = int(sys.stdin.readline())
    people = []
    for i in range(N):
        name, birthday = sys.stdin.readline().split()
        people.append(Person(name, birthday))
    find_youngest_oldest(N, people)
    
    
    image-20230109214216463

    里面参与比大小的datetime是这种格式的
    1990-01-01 00:00:00
    1980-01-01 00:00:00
    1970-01-01 00:00:00

    • 参考:python3 datetime全解,比大小,做差值运算,转化成月、周、日、年等各种级别的运算

  • 搜了一些
    • OJ python答题结果"返回非零"
    • python非零返回_PTA中提交Python3程序的一些套路
    • PAT 中提交 Python3 的一些注意事项
    • 【python & ACM 输入输出的处理:sys.stdin.readline().strip().split())】
    • python3 牛客网:OJ在线编程常见输入输出练习(ACM模式)

【PAT A1011】World Cup Betting

  • 【PAT A1011】World Cup Betting

梳理一下题意

  • W for win, T for tie, and L for lose.

  • There was an odd assigned to each result. The winner’s odd would be the product of the three odds times 65%.

    For example, 3 games’ odds(概率,投注赔率) are given as the following:

     W    T    L
    1.1  2.5  1.7
    1.2  3.1  1.6
    4.1  1.2  1.1
    

    To obtain the maximum profit, one must buy W for the 3rd game, T for the 2nd game, and T for the 1st game. If each bet takes 2 yuans, then the maximum profit would be (4.1×3.1×2.5×65%−1)×2=39.31 yuans (accurate up to 2 decimal places).


没有完全看懂,大概是从输入的9个数据里面找到3个最大的,然后(3个数的积x65%-1)×(选择到的game的个数)

啊不,再看了一眼,是找出每一行最大的相乘?

第一行最大的是2.5,T

第二行最大的是3.1,T

第三行最大的是4.1,W


啊不不,再看一眼题目,each bet takes 2 yuans , 2不是选择到的game的个数哈哈哈, 所有的都是乘以2

开始写代码

  • 首先是要在这个二维数组里面找到每一行的max element,每行就3个,用max应该比较快,同时还需要知道max element的index,从而知道 是 T W 还是 L

一次性AC

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
using namespace std;

const int N = 3;

int main()
{
    double odds[N][N];
    
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++)
        {
            cin >> odds[i][j];
        }
    }
    double res[N];
    for(int i = 0; i < N; i++)
    {
        double* row = odds[i];
        double max_elm = *max_element(row,row+N);
        int max_index = distance(row, max_element(row,row+N));
        res[i]= max_elm;
        if(max_index==0)
            cout << "W ";
        else if(max_index==1)
            cout << "T ";
        else if(max_index==2)
            cout << "L ";
    }
    
    double product = 1.0;
    for(int i = 0; i < N; i++)
    {
        product *= res[i];
    }
    
    product = (product*0.65-1)*2;
    
    printf("%.2f", product);
    
    return 0;
}

关于里面的 max_element() 和 distance()

  • The max_element function returns an iterator to the maximum element in the range [first, last),
  • The distance function calculates the distance between two iterators. In this case, we pass the row of the matrix as the range and get the maximum element and its index in one step.
image-20230109223743282

去看看别人的代码,感觉自己🤣 杀鸡焉用牛刀

  • 参考知乎博主的代码

    【PAT A1011】World Cup Betting - Chilan Yuk的文章 - 知乎 https://zhuanlan.zhihu.com/p/399861108

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    
    const int N = 3;
    
    int main()
    {
       double pro = 0.65;
       double a, b, c;
       for(int i = 0; i < N; i++)
       {
           cin >> a >> b >> c;
           if(a>=b && a>=c) 
           {
               pro *= a; 
               cout << "W ";
           }
           else if(b>=a && b>=c)
           {
               pro *= b;
               cout << "T ";
           }
           else if(c>=a && c>=b)
           {
               pro *= c;
               cout << "L ";
           }
           
       }
       printf("%.2f\n",(pro-1)*2);
       return 0;
    }
    
  • 不过我那个代码通用性确实强一点哈哈哈哈

  • 书上的代码如下

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    
    const int N = 3;
    char S[3] = {'W','T','L'};
    int idx;
    int main()
    {
        double ans = 1.0, tmp, a;
        for(int i = 0; i < 3; i++)
        {
            tmp = 0.0;
            for(int j = 0; j < 3; j++)
            {
                cin >> a;
                if(a > tmp)
                {
                   tmp = a;
                   idx = j;
                }
            }
            
            ans *= tmp;
            printf("%c ", S[idx]);
        }
        printf("%.2f",(ans * 0.65 - 1) * 2);
        return 0;
    }
    

【PAT A1006】Sign In and Sign Out

  • 【PAT A1006】Sign In and Sign Out

AC 还是用前面用到的erase&remove

  • 代码如下

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    typedef struct Time{
        string ID;
        string signIn;
        string signOut;
    }Time;
    
    // 思路:去掉冒号转换为字符串比大小
    // 左边一列最小的就是unlock门的
    // 右边一列最大的就是lock门的
    
    int M;
    Time t[100010];
    bool cmp1(Time t1, Time t2)
    {
        return t1.signIn < t2.signIn;
    }
    bool cmp2(Time t1, Time t2)
    {
        return t1.signOut > t2.signOut;
    }
    int main()
    {
        string signInTemp;
        string signOutTemp;
        cin >> M;
        for(int i = 0; i < M; i++)
        {
            cin >> t[i].ID;
            cin >> signInTemp;
            cin >> signOutTemp;
            signInTemp.erase(remove(signInTemp.begin(),signInTemp.end(),':'),signInTemp.end());
            signOutTemp.erase(remove(signOutTemp.begin(),signOutTemp.end(),':'),signOutTemp.end());
            t[i].signIn = signInTemp;
            t[i].signOut = signOutTemp;
        }
        //排序两次? cmp1 按照第一个元素来排序 cmp2 按照第二个元素来排序
        sort(t,t+M,cmp1);
        cout << t[0].ID << " ";
        sort(t,t+M,cmp2);
        cout << t[0].ID;
        return 0;
    }
    

    乐,再次感叹杀鸡焉用牛刀…🤣🤣🤣🤣🤣

    • 突然发现,完全没有必要把:去掉,带冒号的字符串也完全可以比较大小

    • 把那两行去掉也能AC

      #include <iostream>
      #include <algorithm>
      #include <string>
      #include <cstdio>
      #include <cstdlib>
      using namespace std;
      typedef struct Time{
          string ID;
          string signIn;
          string signOut;
      }Time;
      
      // 思路:去掉冒号转换为字符串比大小
      // 左边一列最小的就是unlock门的
      // 右边一列最大的就是lock门的
      
      int M;
      Time t[100010];
      bool cmp1(Time t1, Time t2)
      {
          return t1.signIn < t2.signIn;
      }
      bool cmp2(Time t1, Time t2)
      {
          return t1.signOut > t2.signOut;
      }
      int main()
      {
          string signInTemp;
          string signOutTemp;
          cin >> M;
          for(int i = 0; i < M; i++)
          {
              cin >> t[i].ID;
              cin >> signInTemp;
              cin >> signOutTemp;
              t[i].signIn = signInTemp;
              t[i].signOut = signOutTemp;
          }
          //排序两次? cmp1 按照第一个元素来排序 cmp2 按照第二个元素来排序
          sort(t,t+M,cmp1);
          cout << t[0].ID << " ";
          sort(t,t+M,cmp2);
          cout << t[0].ID;
          return 0;
      }
      

书上的做法也值得学习一下

image-20230110000002121

确实,这样子省空间

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

struct pNode{
    char id[20];
    int hh, mm, ss;
    
}temp, ans1, ans2;

bool great(pNode node1,pNode node2)
{
    if(node1.hh != node2.hh) return node1.hh > node2.hh;
    if(node1.mm != node2.mm) return node1.mm > node2.mm;
    return node1.ss > node2.ss;
}

int main()
{
    int n;
    cin >> n;
    ans1.hh = 24, ans2.mm = 60, ans1.ss = 60;
    ans2.hh = 0,  ans2.mm = 0,  ans2.ss = 0;
    
//     string colons = ":";
    for(int i = 0; i < n; i++)
    {
//         cin >> temp.id >> temp.hh >> ":" >> temp.mm >> ":" >> temp.ss;
        scanf("%s %d:%d:%d", temp.id, &temp.hh, &temp.mm, &temp.ss);
        if(great(temp,ans1) == false)
            ans1 = temp;
//         cin >> temp.id >> temp.hh >> ":" >> temp.mm >> ":" >> temp.ss;
        scanf("%d:%d:%d",  &temp.hh, &temp.mm, &temp.ss);
        if(great(temp,ans2)== true)
            ans2 = temp;
    }
    cout << ans1.id << " " << ans2.id;
}

要注意这个问题

cin >> temp.id >> temp.hh >> ":" >> temp.mm >> ":" >> temp.ss;还有string colons=":"; cin >> colons 都是不可以的!

The >> operator is used to extract values from an input stream, such as cin, and store them in variables.

一个遗留问题

承接上文,那么我把冒号也当一个变量读进去

但是不管它可以吗

    string colons;
    for (int i = 0; i < n; i++)
    {
        cin >> temp.id;
        cin >> temp.hh >> colons >> temp.mm >> colons >> temp.ss;
        //         scanf("%s %d:%d:%d", temp.id, &temp.hh, &temp.mm, &temp.ss);
        if (great(temp, ans1) == false)
            ans1 = temp;
        //         cin >> temp.id >> temp.hh >> ":" >> temp.mm >> ":" >> temp.ss;
        //         scanf("%d:%d:%d",  &temp.hh, &temp.mm, &temp.ss);
        cin >> temp.hh >> colons >> temp.mm >> colons >> temp.ss;
        if (great(temp, ans2) == true)
            ans2 = temp;
    }

但是,五个样例都是答案错误,我自己去IDE里面跑也是有问题,但是不知道问题出在哪里…

用python玩玩

中途遇到不少次非零返回,发现很多时候是因为读的个数不对,还有list或者tuple的下标越界了之类的…

AC代码1 input()

# Read the input
m = int(input())
records = []
for i in range(m):
    line = input().split()
    id_number = line[0]
    sign_in_time = line[1]
    sign_out_time = line[2]
    records.append((id_number, sign_in_time,sign_out_time))

# Sort the records by sign in time
# 默认升序
records.sort(key=lambda x: x[1])
print(records[0][0],end=" ")
records.sort(key=lambda x: x[2],reverse = True)
print(records[0][0])

注意sort默认是升序,要降序则需要加上reverse = True

AC代码2 sys

import sys

M = int(sys.stdin.readline())
t = []
for i in range(M):
    ID,signIn,signOut = sys.stdin.readline().split()
    t.append((ID,signIn,signOut))

t = sorted(t, key=lambda x: x[1])
print(t[0][0], end=' ')

t = sorted(t, key=lambda x: x[2], reverse=True)
print(t[0][0])

【PAT A1036】Boys VS Girls

  • 【PAT A1036】Boys VS Girls

AC

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct Student
{
    string name;
    char gender;
    string ID;
    int grade;
} STU;
STU boys[1010]; // 题目没给范围嘤
STU girls[1010];
bool cmp(STU s1, STU s2)
{
    return s1.grade < s2.grade;
}
int main()
{
    int N;
    cin >> N; // 老忘记
    int numOfBoys = 0;
    int numOfGirls = 0;
    string name;
    char gender;
    string ID;
    int grade;
    for (int i = 0; i < N; i++)
    {
        cin >> name >> gender >> ID >> grade;
        //         cin >> s[i].name >> s[i].gender >> s[i].ID >> s[i].grade;
        if (gender == 'M')
        {
            boys[numOfBoys].name = name;
            boys[numOfBoys].gender = gender;
            boys[numOfBoys].ID = ID;
            boys[numOfBoys].grade = grade;
            numOfBoys++;
        }

        else
        {
            girls[numOfGirls].name = name;
            girls[numOfGirls].gender = gender;
            girls[numOfGirls].ID = ID;
            girls[numOfGirls].grade = grade;
            numOfGirls++;
        }
    }
    // cmp是升序
    sort(boys, boys + numOfBoys, cmp);
    sort(girls, girls + numOfGirls, cmp);
    if (numOfGirls == 0)
        printf("Absent\n");
    else
        cout << girls[numOfGirls - 1].name << " " << girls[numOfGirls - 1].ID << endl;
    if (numOfBoys == 0)
        printf("Absent\n");
    else
        cout << boys[0].name << " " << boys[0].ID << endl;

    if (numOfBoys == 0 || numOfGirls == 0)
        printf("NA");
    else
        cout << girls[numOfGirls - 1].grade - boys[0].grade;

    return 0;
}

image-20230110013719440

还是学习一下书上的代码

主要是书上没有开那么大的结构体,没有依赖sort

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
struct Student
{
    char name[15];
    char id[15];
    int score;
}M, F, temp; //M为分数最低的男生 F为分数最高的女生
void init()
{
    M.score = 101;
    F.score = -1;
}
int main()
{
    init();
    int N;
    cin >> N; // 老忘记
    char gender;
    for (int i = 0; i < N; i++)
    {
        cin >> temp.name >> gender >> temp.id >> temp.score;
        
        if (gender == 'M' && temp.score < M.score)
        {
            M = temp;
        }

        else if(gender == 'F' && temp.score > F.score)
        {
            F = temp;
        }
    }
    
    if(F.score == -1)
        printf("Absent\n"); //没有女生  这个方法好诶,相当于flag没变化就说明没有输入
    else
        cout << F.name <<" " << F.id << endl;
    
    if(M.score==101)
        cout << "Absent" << endl;
    else 
        cout << M.name <<" "<< M.id << endl;
    if(F.score == -1 || M.score == 101)
        cout << "NA";
    else
        cout << F.score - M.score;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第7天 383.赎金信、454. 四数相加II、15.三数之和、18.四数之和

代码随想录算法训练营第7天 383.赎金信、454. 四数相加II、15.三数之和、18.四数之和 赎金信 力扣题目链接(opens new window) 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串&#xff0c;判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构…

ERP系统到底能做什么?

ERP是什么&#xff1f;ERP即企业资源计划&#xff0c;ERP系统主要是优化企业内部的业务流程&#xff0c;用信息化管控的方式进行采购管理、库存管理、销售管理和财务管理等板块。它可以看作是进销存系统的进阶版&#xff0c;主要针对供应链中下游。 一、ERP系统怎么产生的&…

SpringBoot(项目创建使用+配置文件+日志文件)

目录 1. Spring Boot 项目创建 2. 写一个 Hello World 并运行 3. 配置文件的作用及格式 4. properties 配置文件的基本语法 5. 读取配置文件 6. yml 配置文件说明 7. properties 和 yml 的区别 8. SpringBoot 日志文件 8.1 日志的作用 8.2 自定义日志打印 8.3 日志…

低代码:全力构筑企业数字转型新生态

数字转型企业处于数字经济大潮的风口浪尖&#xff0c;既是创新主体也是数字技术广泛运用的重要平台&#xff0c;主动调整企业发展战略以顺应数字化转型是其明智抉择。企业经营决策者应深刻认识数字化转型的发展特点及本质要求&#xff0c;看到数字化转型是企业战略的迭代升级&a…

C#,图像二值化(19)——全局阈值的香巴拉算法( Shanbhag Thresholding)及源程序

1 算法描述&#xff08;凑数&#xff09;thresholdShanbhag由Robert Haase基于G.Landini和W.Rasband的工作。自动阈值器利用ImageJ中实现的Shanbhag阈值方法&#xff0c;使用GPU上确定的直方图创建尽可能类似于ImageJ“应用阈值”方法的二进制图像。thresholdShanbhag By Rober…

「精致店主理人」:青年敢有所为,梦想掷地有声

第三期「精致店主理人」青年创业孵化营于12月16日在周大福顺德匠心智造中心&#xff0c;完美收官&#xff01;「精致店主理人」青年创业孵化营是在共青团深圳市委员会的指导下&#xff0c;由深圳市青少年发展基金会与周大福珠宝集团联合主办&#xff0c;郑家纯青年发展专项基金…

CPU基本结构和运行原理

1 CPU的基本结构 1.1 CPU是一个计算系统的核心 Control Unit&#xff0c;负责控制。如指令计数器&#xff0c;指令跳转。 Logic Unit&#xff0c;负责计算。如加减&#xff0c;比较大小等。 1.2 南北桥芯片将CPU与外设连接 北桥&#xff1a;CPU和内存、显卡等部件进行数据交…

Python解题 - CSDN周赛第22期 - 取数字

又是大放水的一期&#xff0c;连我都可以10分钟解决战斗了。得益于Python&#xff0c;前面三题5分钟内就pass了&#xff0c;而最后一题也是之前刷过类似的。。。于是相应地&#xff0c;这期的题解也会简短一些。 这次的好成绩代表不了实力&#xff0c;但也希望这样的好运气能一…

自然语言处理 概览理解 NLP specialization - Supervised ML

自然语言处理 概览理解 NLP specialization - Supervised ML Remember that understanding the data is one of the most critical steps in Data Science 自然语言处理可以实现语义识别&#xff0c;情感识别&#xff0c;文本翻译等等功能&#xff0c;当然最近情况下最火的便…

Java支付宝沙箱环境支付,官方Demo远程调试【内网穿透】

文章目录1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙箱环境中有多种支付…

MATLAB-一维插值运算

一维插值是指对一维函数进行插值。已知n1个结点(x,y,)&#xff0c;其中x,互不相同(j0&#xff0c;1&#xff0c;2&#xff0c;... n),求任意插值点x*处的插值y*。求解一维插值问题的主要思想是:设结点由未知的函数g(x)产生&#xff0c;函数g(x)为连续函数且g(x)y;(j0,1,...,n);…

北大硕士LeetCode算法专题课---算法复杂度介绍

算法复杂度中大O的含义 推荐教程&#xff1a;北大硕士带你手撕Leetcode算法题 大O复杂度表示法 算法面试中&#xff0c; 经常会被问到&#xff0c;你写的算法复杂度是多少&#xff0c; 或者设计一个复杂度为 O(nlogn) 的算法复杂度分析是估算算法执行效率的方法&#xff0c;…

大厂的格局在细节上是怎么被拉低的

讲几个例子&#xff0c;都是大厂&#xff0c;作为大厂小散沙客户&#xff0c;也就是平头老百姓的角度来反观一下几个问题 第一个【脉脉】 今天&#xff08;2023年1月9日&#xff09;偶尔相等一下买买查看一下信息&#xff0c;由于手机没有安装APP.想借助PC的web端登录一下 它提…

小程序中无法播放阿里云的视频点播

背景视频直接存在自己的服务器&#xff0c;视频大了会存在卡顿现象&#xff0c;只能用阿里云或其它服务商的相关服务。原来在APP中已有了视频播放的功能&#xff0c;而且已经能正常使用&#xff0c;但视频的url是 http。现在期望在小程序中也添加视频播放的功能。初期操作申请相…

css——扁平圆弧(底部弧度)

案例演示 使用伪类处理&#xff0c;先将元素自身定位为relative&#xff0c;伪类设置content:‘’&#xff0c;并相对定位为absolute&#xff0c;再设置下left ,top 值&#xff0c;然后通过改变width和和left就可以调节弧度。宽度需大于100%&#xff0c;将left设为&#xff08;…

微分方程(人口预测与传染病模型)

一、定义 微分方程&#xff1a;含导数或微分的方程 微分方程的阶数&#xff1a;所含导数或微分的最高阶数&#xff0c;如y’’’2y’’-2x0是三阶微分方程 微分方程的解&#xff1a;使得微分方程成立的函数 例如y’-2x0的解可以为x或者x1 微分方程的通解和特解&#xff1a;特…

基于Arduino Pro Micro的游戏手柄制作

基于Arduino Pro Micro的游戏手柄开发 1. Arduino IDE下载及安装 在Arduino官网Software | Arduino下载最新版Arduino IDE并安装。 或使用QQ群中提供的免安装版Arduino IDE&#xff0c;安装完成后Arduino Pro Micro的pin脚定义使用下面路径下的leonardo: 2. Arduino Pro Micr…

GrapeCity 文档处理商业系列Crack-6.0.2Version

GrapeCity 文档处理商业系列Crack文档 API 使用高速、直观的文档 API 全面控制您的文档 包括&#xff1a; Documents for Excel, .NET Documents for Data Viewer Documents for PDF Documents for PDF Viewer Documents for Word Documents for Imaging Documents for Image V…

数据库MySQL基础入门之MySQL隐式转换

一、问题描述 rootmysqldb 22:12: [xucl]> show create table t1\G *************************** 1. row *************************** Table: t1Create Table: CREATE TABLE t1 ( id varchar(255) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8 1 row in set (0.0…

ArcGIS基础实验操作100例--实验74灾害影响缓冲区分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验74 灾害影响缓冲区分析 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…