胡凡 《算法笔记》 上机实战训练指南 chap3 入门模拟: 3.2 查找元素
Posted 临风而眠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了胡凡 《算法笔记》 上机实战训练指南 chap3 入门模拟: 3.2 查找元素相关的知识,希望对你有一定的参考价值。
胡凡 《算法笔记》 上机实战训练指南 chap3 入门模拟: 3.2 查找元素
文章目录
- 胡凡 《算法笔记》 上机实战训练指南 chap3 入门模拟: 3.2 查找元素
- 【PAT B1041】考试座位号
- 【PAT B1004】成绩排名
- 【PAT B1028】人口普查
- 【PAT A1011】World Cup Betting
- 【PAT A1006】Sign In and Sign Out
- 【PAT A1036】Boys VS Girls
【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】成绩排名
-
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 查找元素的主要内容,如果未能解决你的问题,请参考以下文章