官网https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7
文章目录
-
- [L1-085 试试手气](#L1-085 试试手气)
- [L1-086 斯德哥尔摩火车上的题](#L1-086 斯德哥尔摩火车上的题)
- [L1-087 机工士姆斯塔迪奥](#L1-087 机工士姆斯塔迪奥)
- [L1-088 静静的推荐](#L1-088 静静的推荐)
L1-085 试试手气
题目大意:给定6个骰子的初始朝上点数,每次摇骰子需满足两条规则:每个骰子的点数不能和自身之前出现过的任何点数重复;在满足第一条规则的前提下,每个骰子都取当前可行的最大点数。求第k次摇出的6个骰子的点数结果。
核心思路 :
6个骰子的点数变化相互独立,可逐个单独计算。对于单个骰子,初始点数为第0次的状态,后续每次都从剩余未出现的点数中选择最大值,因此每个初始点数对应的后续序列是固定的:排除初始点数后,将1~6从大到小排列,依次对应第1、2、3、4、5次的结果。
例如初始点数为3时,排除3后剩余点数降序为6、5、4、2、1,对应第1次结果为6,第2次为5,第3次为4,以此类推。
正解代码
cpp
#include<iostream>
#include<vector>
using namespace std;
int sz(int x,int y){
int a1[]={1,6,5,4,3,2},a2[]={2,6,5,4,3,1},a3[]={3,6,5,4,2,1},
a6[]={6,5,4,3,2,1},a5[]={5,6,4,3,2,1},a4[]={4,6,5,3,2,1};
if(x==a1[0])return a1[y];
else if(x==a2[0])return a2[y];
else if(x==a3[0])return a3[y];
else if(x==a4[0])return a4[y];
else if(x==a5[0])return a5[y];
else if(x==a6[0])return a6[y];
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
vector<int>b(6);
for(int i=0;i<6;i++)cin>>b[i];
int y;cin>>y;
for(int i=0;i<6;i++){
if(i!=5)cout<<sz(b[i],y)<<" ";
else cout<<sz(b[i],y);
}
return 0;
}
代码实现要点:
- 预处理6种初始点数对应的结果数组,数组下标对应摇的次数,通过查表直接获取结果。
- 输入6个初始点数和次数k,遍历每个骰子查表,按格式输出结果。
L1-086 斯德哥尔摩火车上的题
题目大意:给定两个数字字符串,按照指定算法处理字符串:从第二个字符开始遍历,若当前字符与前一个字符的奇偶性相同,则将两个字符中较大的字符拼接到结果字符串末尾。比较两个字符串的处理结果,相同则输出该结果,不同则分别输出两个结果。
核心思路 :
封装独立的字符串处理函数,输入原始数字字符串,按规则生成结果字符串,再将两个输入字符串分别处理后对比输出即可。
由于数字字符的ASCII码奇偶性与对应数字的奇偶性一致(数字d的ASCII值为48+d,48为偶数,因此奇偶性与d相同),可直接对字符做取模运算判断奇偶;同时字符的ASCII大小顺序与数字大小顺序一致,直接使用max比较字符即可。
正解代码
cpp
#include<bits/stdc++.h>
using namespace std;
string res(string s){
string ans;
for (int i= 1; i < s.size(); i++) {
if (s[i] % 2 == s[i-1] % 2) {
ans += max(s[i], s[i-1]);
}
}
return ans;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
string s1,s2;
cin>>s1>>s2;
if(res(s1)==res(s2))cout<<res(s1);
else cout<<res(s1)<<endl<<res(s2);
return 0;
}
代码实现要点:
- 封装处理函数提升代码复用性,函数内从下标1开始遍历字符串。
- 逐位判断相邻两个字符的奇偶性,符合条件则拼接较大字符。
- 对比两个处理结果,按题目要求格式输出。
L1-087 机工士姆斯塔迪奥
题目大意:给定n行m列的网格,共q次操作,每次操作标记一整行或一整列为危险区域。求最终安全格子的总数(安全格子指所在行和所在列均未被标记的格子)。
核心思路 :
安全格子的数量计算公式为:未被标记的行数 × 未被标记的列数。
重复标记同一行/列不会产生额外效果,因此需要统计去重后的被标记行数与列数。未被标记行数 = 总行数n - 不同的被标记行数;未被标记列数 = 总列数m - 不同的被标记列数,二者相乘即为最终答案。
例如样例中5行5列,共标记2个不同行、1个不同列,安全格子数为 (5-2) × (5-1) = 12。
正解代码
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
bool a[2][N];
int main(){
int n,m,q;
cin>>n>>m>>q;
while(q--){
int l,r;
cin>>l>>r;
if(l==0&&!a[0][r]){
a[0][r]=1;
n--;
}
if(l==1&&!a[1][r]){
a[1][r]=1;
m--;
}
}
cout<<n*m;
return 0;
}
代码实现要点:
- 使用两个布尔数组分别记录行、列的标记状态,避免重复计数。
- 遍历所有操作,遇到未标记的行/列则打上标记,并将对应剩余行数/列数减1。
- 最终输出剩余行数与剩余列数的乘积。
L1-088 静静的推荐
题目大意:从参赛学生中选拔推荐名单,规则如下:
- 仅考虑天梯赛分数不低于175分的学生;
- 共可推荐k批次,同一批次内学生成绩原则上严格递增;
- 若学生天梯赛成绩与同批前一人相同,但PAT成绩达到企业面试分数线,则也可加入该批次。
求最多可推荐的学生总人数。
核心思路 :
为最大化推荐人数,采用最优分配策略:
- PAT达标学生:所有天梯赛≥175且PAT达标的学生均可被推荐。同分的PAT达标学生不受严格递增限制,可全部放入对应批次,不占用普通学生的批次名额。
- 普通学生(PAT未达标) :每个分数的普通学生,最多每批次推荐1人,共k批次,因此每个分数最多推荐
min(该分数普通学生人数, k)人。
总推荐人数 = 天梯赛≥175且PAT达标的人数 + 每个分数普通学生人数取min(人数, k)的总和。
正解代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,k,s,cnt=0,ans=0;
cin>>n>>k>>s;
map<int,int>mp;
for(int i=0;i<n;i++){
int x,y;
cin>>x>>y;
if(x>=175){
if(y>=90)cnt++;
else mp[x]++;
}
}
ans+=cnt;
for(auto i:mp)ans+=min(i.second,k);
cout<<ans;
return 0;
}
代码实现要点:
- 遍历所有学生,筛选出天梯赛分数≥175的学生。
- 若学生PAT成绩达到输入的分数线s,直接计入达标总数;否则用map或数组统计每个分数的普通学生人数。
- 遍历所有分数的普通学生人数,累加
min(人数, k),再加上达标总数得到最终答案。