2025 寒假训练第二周
天梯赛
考点:模拟基本功
L1-8 静静的推荐
如果知道了当PAT成绩大于s的时候,推荐这个人是不占名额的,那么对于批次的分配,每个对应的分数不大于k就可以,掌握了这个点,这道题的代码就很短了
void solve()
{
int n,k,s;
cin>>n>>k>>s;
int ans=0;
map<int,int>mp;
while(n--)
{
int x,y;
cin>>x>>y;
if(x>=175){
if(y>=s) ans++;
else if(mp[x]<k){
ans++;
mp[x]++;
}
}
}
cout<<ans;
}
L2-1 插松枝
恶心的不行的一道大模拟。。。
1.对箱子空或不空分类讨论,
如果箱子是空的,那么会有以下三种情况:
a、推进器的当前这个就是符合条件的,那么直接取,退出循环;
b、推进器当前这个不符合,下一个也不符合,就不断放进箱子,当然也要考虑箱子的大小
c、放着放着箱子放满了,推进器的也不符合要求,就开始下一个松枝的制作
如果箱子有东西,就要分类讨论其当前这个符合或者不符合题意
a、不符合,首先判推进器还有东西吗,没有就直接开始做下一个,如果有就是还要判断1中的abc三种情况,复制粘贴即可
b、符合了直接放进去就可以
#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define int long long
using pii=pair<int,int>;
using triple=tuple<int,int,int>;
int dx[]={0,0,-1,1,-1,-1,1,1};
int dy[]={1,-1,0,0,-1,1,-1,1};
void solve()
{
int n,m,k;
cin>>n>>m>>k;
queue<int>q;
queue<int>ans[2000];
stack<int>box;
for(int i=0;i<2000;i++) ans[i].push(200); //放一个大数 省去判空的步骤
for(int i=0;i<n;i++){
int x; cin>>x;
q.push(x);
}
int p=1;
while(q.size()||box.size() ){
if(ans[p].size()==k+1){//这个松枝已经插满了
p++;
}
if(box.empty()){
//箱子空的
while(q.size())
{
//直接从推进器去拿
int x=q.front();
if(x<=ans[p].back())
{
ans[p].push(x);
q.pop();
break;
}else if(box.size()<m) //推进器的放不了 就放盒子里 但要够放
{
box.push(x);
q.pop();
}
else{//盒子满了 推进器也不符合要求
p++;
break;
}
}
}else{ //箱子不空
int x=box.top();
if(x>ans[p].back())
{
if(q.empty()){
p++;
}
while(q.size())
{
//直接从推进器去拿
x=q.front();
if(x<=ans[p].back())
{
ans[p].push(x);
q.pop();
break;
}else if(box.size()<m) //推进器的放不了 就放盒子里 但要够放
{
box.push(x);
q.pop();
}
else{//盒子满了 推进器也不符合要求
p++;
break;
}
}
}else{//符合要求
ans[p].push(x);
box.pop();
}
}
}
for(int i=1;i<=p;i++)
{
ans[i].pop();
cout<<ans[i].front();
ans[i].pop();
while(ans[i].size())
{
cout<<" "<<ans[i].front();
ans[i].pop();
}
cout<<"\n";
}
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0);
int t=1;
// cin>>t;
while(t--) solve();
}
L2-2 老板的作息表
这一题其实就是注意时间的存储类型,用pair<string,string>来存,题目就变得很简单了,只需要输出有时间段点的地方就可以了
#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define int long long
using pii=pair<int,int>;
using triple=tuple<int,int,int>;
int dx[]={0,0,-1,1,-1,-1,1,1};
int dy[]={1,-1,0,0,-1,1,-1,1};
using pss=pair<string,string>;
void solve()
{
int n;
cin>>n;
vector<pss>ve;
for(int i=0;i<n;i++)
{
string a,b,x;
cin>>a>>x>>b;
ve.push_back({a,b});
}
ve.push_back({"","00:00:00"});
ve.push_back({"23:59:59",""});
sort(ve.begin(),ve.end());
for(int i=1;i<=ve.size();i++)
{
if(ve[i].first!=ve[i-1].second){
cout<<ve[i-1].second<<" - "<<ve[i].first<<"\n";
}
}
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0);
int t=1;
//cin>>t;
while(t--) solve();
}
考点:二叉树
L2-3 龙龙送外卖
怎么样让我们经过所有目的地,同时保持代价最小,从贪心的角度想,我们可以举个例子,一个点深度大,一个点深度小,那么你肯定是先走到深度小的,然后绕回出发点,再去走深度大的,因为深度大的如果你多走一次,那么代价就会更大。
然后,画图我们可以多枚举几个点,可以发现最小的代价=所有的简单路径*2-最长的那一条路的,想好递归这个过程,每添加一个点,要看最长的那条是不是更新了
int dis[100005];
int fa[100005];
int mx=0;
int dfs(int x,int d)
{
if(fa[x]==-1||dis[x]){//画图理解,如果走到根节点或者该点已经走过就要返回距离,并且
mx=max(mx,dis[x]+d);
return 2*d;
}
int res=dfs(fa[x],d+1);
dis[x]=dis[fa[x]]+1;
return res;
}
void solve()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>fa[i];
}
int sum=0;
while(m--){
int x; cin>>x;
sum+=dfs(x,0);
cout<<sum-mx<<"\n";
}
}
牛客
小L出师了
这题容易想到去减掉炸鸡的场数然后去整除,但是还得注意,炸鸡的场数是要用来隔开的小l的,所以也要考虑这个点
void solve()
{
int n,t,k;
cin>>n>>t>>k;
cout<<min((n-k)/t,k+1)<<"\n";
}
小L的数学题
只要记住非0整数无法变成0,并且0也无法变成非零整数,其他数,大了你就去开方,小了你就去乘2,总是可以变成你要的数的,可以当成结论来记
void solve()
{
int n ,m;
cin>>n>>m;
if(n==0&&m!=0) cout<<"No";
else if(m==0&&n!=0) cout<<"No";
else cout<<"Yes";
cout<<"\n";
}
posted on 2025-02-09 17:14 swj2529411658 阅读(25) 评论(0) 收藏 举报
浙公网安备 33010602011771号