Skip to content

Commit c162b64

Browse files
committed
docs: 添加更多PTA题解
1 parent 3abac14 commit c162b64

File tree

1 file changed

+251
-16
lines changed
  • content/blog/soft-enginering-exam

1 file changed

+251
-16
lines changed

content/blog/soft-enginering-exam/index.md

Lines changed: 251 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ tags: ["福州大学" ,"转专业" ,"C++", "Python", "算法"]
1515
思路:先用模拟求一下需要使用的符号和层数,然后再输出即可
1616

1717
```cpp
18-
#include <iostream>
1918
#include <bits/stdc++.h>
2019

2120
using namespace std;
@@ -54,7 +53,6 @@ int main()
5453
思路:从`2`为开头,长度`len`寻找满足条件的因数列(`n%因数积==0`),坑是遇到质数,因数是他本身
5554

5655
```cpp
57-
#include <iostream>
5856
#include <bits/stdc++.h>
5957

6058
using namespace std;
@@ -112,7 +110,6 @@ int main()
112110
思路:定义一个和的分子分母`a、b`,然后用公式去算,最后用`__gcd()`求最大公约数化简,坑是有一个测试点是0,要单独处理
113111

114112
```cpp
115-
#include <iostream>
116113
#include <bits/stdc++.h>
117114

118115
using namespace std;
@@ -236,10 +233,9 @@ int main()
236233

237234
### 5. [L1-028 判断素数](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=994805106325700608)
238235

239-
思路:先特殊情况排除`x<2`不是质数,然后再判断`x==2`是质数,然后再排除偶数,最后循环用奇数验证`x`是否为质数,坑是数范围是2的31次方,刚好不能用`int`(2的31次方-1),得用`long long`存(2的64次方-1)
236+
思路:先特殊情况排除`x<2`不是质数,然后再判断`x==2`是质数,然后再排除偶数,最后循环用奇数验证`x`是否为质数,坑是数范围是2的31次方,刚好不能用`int`($2^{31}-1$),得用`long long`存($2^{63}-1$)
240237

241238
```cpp
242-
#include <iostream>
243239
#include <bits/stdc++.h>
244240

245241
using namespace std;
@@ -297,7 +293,6 @@ int main()
297293
思路:先判断字符串长度和目标长度,不够就用`string`补齐空位,超出就用`substr`截取,坑就是如果你用`cin`读取前两个数据,那么你的`cin`的缓冲区会剩余一个换行符,你需要在`getline`读取字符串之前调用`cin.ignore()`忽略掉缓冲区的换行符。
298294
299295
```cpp
300-
#include <iostream>
301296
#include <bits/stdc++.h>
302297
303298
using namespace std;
@@ -331,7 +326,6 @@ int main()
331326
思路:先把字符串存到分片存到列里面,当然可以用`substr`,我懒就直接遍历字符串了,然后`reverse`反转一下,最后在按照格式打印就行了,坑就是每列的字符数不够要补空格不然会吃WA
332327

333328
```cpp
334-
#include <iostream>
335329
#include <bits/stdc++.h>
336330

337331
using namespace std;
@@ -387,7 +381,6 @@ int main()
387381
思路:模拟,没啥难的。坑是输入可能有问题,所以结束的书要及时`erase`掉,还有`round(double,double)`返回值还是`double`要转为`int`不然格式化会出事233
388382

389383
```cpp
390-
#include <iostream>
391384
#include <bits/stdc++.h>
392385

393386
using namespace std;
@@ -469,7 +462,6 @@ print(n//x,c)
469462
思路:给每个学校都准备个`vector`表示每个学校的座位,然后把这些`vector`打包塞进一个`vector`表示所有学校,然后主循环中维护变量`i`表示每个学校对应的座位索引,还有变量`seat`表示座位号,遍历学校`vector`,通过`i`给每个学校相同队伍位置赋值`seat`,每赋值一次`seat++`,直到只剩一个学校`seat+=2`,最后输出结果。坑没多少,但是大模拟很考验耐心,慢慢调试。
470463

471464
```cpp
472-
#include <iostream>
473465
#include <bits/stdc++.h>
474466

475467
using namespace std;
@@ -589,7 +581,6 @@ int main()
589581
| **垂直镜像** | `new[i][j] = old[n-1-i][j]` | `1 2 3``7 8 9`<br>`4 5 6``4 5 6`<br>`7 8 9``1 2 3` |
590582

591583
```cpp
592-
#include <iostream>
593584
#include <bits/stdc++.h>
594585

595586
using namespace std;
@@ -644,7 +635,7 @@ int main()
644635
}
645636
```
646637

647-
### 13. [L1-058 6翻了](<https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1111914599408664577>)
638+
### 13. [L1-058 6翻了](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1111914599408664577)
648639

649640
思路:用正则表达式替换掉9个以上的连续`6``27`,然后替换掉3个以上的连续`6``9`,注意替换顺序
650641

@@ -658,15 +649,259 @@ s=re.sub("6{4,9}","9",s)
658649
print(s)
659650
```
660651

661-
### 14. [L1-064](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1111914599412858885)
652+
### 14. [L1-064 估值一亿的AI核心代码](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1111914599412858885)
662653

663-
### 15. [L1-071](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1336215880692482054)
654+
思路:字符串处理首先想`Python`用正则表达式,不然会被恶心死,当然这题就算你用正则表达式也会被恶心。首先要先把字符串转为小写,这里按照题目要求排除`I`,然后处理空格,利用正则表达式删除所有不符合要求的空格,然后把2个以上的空格替换为1个空格,然后匹配`I``me`换位`__you`,注意不能直接换成`you`,可能会和下面的`can you`冲突,然后匹配完`can you`再把`__you`换回去
664655

665-
### 16. [L1-072](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1336215880692482055)
656+
| 正则表达式 | 替换为 | 作用描述 |
657+
|------------|--------|----------|
658+
| `r"^ +"` | `""` | 删除字符串开头的所有空格 |
659+
| `r" +$"` | `""` | 删除字符串末尾的所有空格 |
660+
| `r" +(?=[!?.:'])"` | `""` | 删除标点符号(`!?.:'`)前的所有空格 |
661+
| `r" {2,}"` | `" "` | 将两个或更多连续空格替换为单个空格 |
662+
| `r"\b(I\|me)\b"` | `"__you"` | 将单词"I"或"me"临时替换为"__you" |
663+
| `r"\bcan you\b"` | `"I can"` | 将"can you"转换为"I can" |
664+
| `r"\bcould you\b"` | `"I could"` | 将"could you"转换为"I could" |
665+
| `"__you"` | `"you"` | 将临时标记"__you"恢复为"you" |
666666

667-
### 17. [L1-087](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1518581903422062592)
667+
```python
668+
import re
669+
670+
n=int(input())
671+
for _ in range(n):
672+
s=input()
673+
print(s)
674+
675+
s=s.replace("?","!")
676+
s = "".join([ i.lower() if i!='I' else i for i in s])
677+
678+
s=re.sub(r"^ +| +$| +(?=[!?.:'])","",s)
679+
s=re.sub(r" {2,}"," ",s)
680+
681+
s=re.sub(r"\b(I|me)\b","__you",s)
682+
s=re.sub(r"\bcan you\b","I can",s)
683+
s=re.sub(r"\bcould you\b","I could",s)
684+
s=s.replace("__you","you")
685+
686+
print("AI:",s)
687+
```
688+
689+
### 15. [L1-071 前世档案](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1336215880692482054)
690+
691+
思路:发现每回答一次n,结论增加$2^{层数-1}$,所以就很简单了
692+
693+
```cpp
694+
#include <bits/stdc++.h>
695+
696+
using namespace std;
697+
698+
using ll = long long;
699+
700+
int main()
701+
{
702+
int n,m;
703+
cin >> n >> m;
704+
for (int i=0;i<m;i++)
705+
{
706+
int ans=1;
707+
for (int j=n-1;j>=0;j--)
708+
{
709+
char c;
710+
cin >> c;
711+
if (c=='n')
712+
{
713+
ans+=pow(2,j);
714+
}
715+
}
716+
cout << ans << '\n';
717+
}
718+
}
719+
```
720+
721+
### 16. [L1-072 刮刮彩票](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1336215880692482055)
722+
723+
思路:又是一题超级烦人大模拟,首先应该先读取初始棋盘,但是有个坑,就是有一个`0`需要你填出来,可以先记一下`0`的位置,然后求一下和,最后用`45-和`就是`0`的点数,还有个坑就是求列的点数和的时候得`d-3-1`,最后建个`unordered_map`映射点数和金币(傻逼)
724+
725+
```cpp
726+
#include <bits/stdc++.h>
727+
728+
using namespace std;
729+
730+
using ll = long long;
731+
732+
unordered_map<int,int> coins =
733+
{
734+
{6,10000},{7,36},{8,720},{9,360},{10,80},{11,252},{12,108},
735+
{13,72},{14,54},{15,180},{16,72},{17,180},{18,119},{19,36},
736+
{20,306},{21,1080},{22,114},{23,1800},{24,3600}
737+
};
738+
739+
int main()
740+
{
741+
int g[3][3];
742+
743+
int init_x,init_y,sum=0;
744+
for (int r=0;r<3;r++)
745+
{
746+
for (int c=0;c<3;c++)
747+
{
748+
int x;
749+
cin >> x;
750+
g[r][c]=x;
751+
sum+=x;
752+
if (x==0)
753+
{
754+
init_x=r;
755+
init_y=c;
756+
}
757+
}
758+
}
759+
760+
g[init_x][init_y]=45-sum;
761+
762+
for (int i=0;i<3;i++)
763+
{
764+
int x,y;
765+
cin >> x >> y;
766+
x--; y--;
767+
768+
cout << g[x][y] << '\n';
769+
}
770+
771+
int d,p=0;
772+
cin >> d;
773+
774+
if (d<=3)
775+
{
776+
for (int c=0;c<3;c++)
777+
{
778+
p+=g[d-1][c];
779+
}
780+
}
781+
else if (d<=6)
782+
{
783+
for (int r=0;r<3;r++)
784+
{
785+
p+=g[r][d-1-3];
786+
}
787+
}
788+
else if (d==7)
789+
{
790+
for (int i=0;i<3;i++)
791+
{
792+
p+=g[i][i];
793+
}
794+
}
795+
else
796+
{
797+
for (int i=0;i<3;i++)
798+
{
799+
p+=g[i][3-1-i];
800+
}
801+
}
802+
cout << coins[p];
803+
804+
}
805+
```
806+
807+
### 17. [L1-087 机工士姆斯塔迪奥](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1518581903422062592)
808+
809+
思路:首先创建图格`vector<vector<bool>>`存储地图,然后读取输入来将被炸的格子设为不安全,最后遍历整个地图,统计所有安全的图格
810+
811+
```cpp
812+
#include <bits/stdc++.h>
813+
814+
using namespace std;
815+
816+
using ll = long long;
817+
818+
int main()
819+
{
820+
int n,m,q;
821+
cin >> n >> m >> q;
822+
vector<vector<bool>> g(n,vector<bool>(m));
823+
824+
for (int i=0;i<q;i++)
825+
{
826+
bool column;
827+
int p;
828+
cin >> column >> p;
829+
p--;
830+
if (column)
831+
{
832+
for (int j=0;j<n;j++)
833+
{
834+
g[j][p]=true;
835+
}
836+
}
837+
else
838+
{
839+
for (int j=0;j<m;j++)
840+
{
841+
g[p][j]=true;
842+
}
843+
}
844+
}
845+
846+
int res=0;
847+
for (int i=0;i<n;i++)
848+
{
849+
for (int j=0;j<m;j++)
850+
{
851+
if (!g[i][j])
852+
{
853+
res++;
854+
}
855+
}
856+
}
857+
cout << res;
858+
}
859+
```
860+
861+
### 18. [L1-088 静静的推荐](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1518582000729911296)
862+
863+
思路:用`map<int,pair<int,int>>`存储天梯赛分数和PTA分数,其中PTA达标的和没达标的分开存到`pair<int,int>`中,输入时忽略天梯赛分数低于175分的学生(~~斩杀线~~),然后遍历整个`map`,其中PTA分数达标的学生无论K够不够都可以直接被录取,所以直接`res+=p.second.first;`,PTA分数没达标的学生只能在K论中按照成绩被录取,所以去k和人数的最小值即`res+=min(k,p.second.second);`,注意这题使用模拟会直接超时,坑死了
668864

669-
### 18. [L1-088](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1518582000729911296)
865+
```cpp
866+
#include <bits/stdc++.h>
867+
868+
using namespace std;
869+
using ll = long long;
870+
871+
int main()
872+
{
873+
int n,k,s;
874+
cin >> n >> k >> s;
875+
map<int,pair<int,int>> stu;
876+
877+
for (int i=0;i<n;i++)
878+
{
879+
int gplt,pta;
880+
cin >> gplt >> pta;
881+
882+
if (gplt<175)
883+
{
884+
continue;
885+
}
886+
887+
if (pta>=s)
888+
{
889+
stu[gplt].first++;
890+
}
891+
else
892+
{
893+
stu[gplt].second++;
894+
}
895+
}
896+
int res=0;
897+
for (auto &p:stu)
898+
{
899+
res+=min(k,p.second.second);
900+
res+=p.second.first;
901+
}
902+
cout << res;
903+
}
904+
```
670905

671906
### 19. [L1-094](https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1649748772841508869)
672907

0 commit comments

Comments
 (0)