天梯选拔赛第一场
这一场发挥的不好,交四题错三题,思路不对,题意理解的不好。
再接再厉
A 私人笑声
这一题为错在我老是觉得要整段整段的输出,其实可以输出每个s[i],只要遇到'.'我们输出xixixixi.,不是则输出原来的s[i]即可
点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
string s;
getline(cin,s);
for(int i=0;i<s.size();i++)
{
if(s[i]=='.') cout<<".xixixixi.";
else cout<<s[i];
}
}
int main()
{
solve();
}
B 孵化小鸡
这题学了一个新的知识点,二进制枚举,即可以用0和1来表示选或者不选的状态,感谢欧哥的指点,对每个鸡蛋验证是否可以达到他的临界值,下面的代码有详细的注解
点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
void solve()
{
int n,m;
cin>>n>>m;
vector<int>a(101,-1);//放鸡蛋的区间
for(int i=1;i<=n;i++)
{
int l,r,x;
cin>>l>>r>>x;
for(int j=l;j<=r;j++)
{
a[j]=x; //每个鸡蛋孵化所需的温度
}
}
vector<int>p(m),k(m);//p存每个暖源的花费,k存每个暖源的加热值
vector<pii>q(m);//q存每个暖源的加热范围,用左右点来存
for(int i=0;i<m;i++)
{
cin>>q[i].first>>q[i].second;
cin>>k[i]>>p[i];
}
int res=1e9;
//然后开始进行二进制枚举和验证 1代表取这种暖源,2代表不取
for(int sz=0;sz<(1<<m);sz++)//有2的m次方种情况
{
vector<int>b(101);//存每个暖源加热的每个位置的值
int ans=0;
for(int i=0;i<m;i++)
{
if((sz>>i)&1)//想象一下把如0010往右移动一位,两位,三位,四位,看其为0还是1
{
for(int j=q[i].first;j<=q[i].second;j++)
{
b[j]+=k[i];//每个坑上升的温度
}
ans+=p[i];
}
}
//验证是否每个鸡蛋都达到了要求的温度
int st=1;
for(int i=1;i<101;i++)
{
if(a[i]!=-1&&b[i]<a[i])
{
st=0;
break;
}
}
// 满足更新res;
if(st) res=min(res,ans);
}
cout<<res;
}
int main()
{
solve();
}
G 相加余三(easy)
这一题其实就是纯纯模拟,但是注意不要有细节上的错误
点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n,sum1=0,sum2=0,sum3=0;
cin>>n;
vector<int>a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=n;i+=2)
{
sum1+=(a[i]+a[i-1])%3;
if(n-i<2) break;
}
for(int i=n;i>=1;i-=2){
sum2+=(a[i]+a[i-1])%3;
if(i<2) break;
}
sum2=max(sum1,sum2);
for(int i=1,j=n;j-i+1>=2;i++,j--)
{
sum3+=(a[i]+a[j])%3;
}
sum3=max(sum2,sum3);
cout<<sum3;
}
int main()
{
solve();
}
J 最后都是0
这一题理解错题目的意思了,每一个自然数减掉一位数以后会变成另一个自然数,而不是一个数选了一个位数以后一直减到0,这题感谢牛哥,欧哥指点。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n,ans=0;
cin>>n;
while(n!=0){
int m=n;
int max1=-1;
while(m!=0)
{
max1=max(max1,m%10);
m/=10;
}
n-=max1;
ans++;
}
cout<<ans;
}
int main()
{
solve();
}
D 划分田地(easy)
这题感谢韦学姐的指点,首先我们要明确是如何通过点去确定最小的矩形的,然后枚举每个点选或不选的情况,还是二进制枚举,但是可能会有重复的情况,所以我们可以使用set来避免,注意空集也算一个,两个点的x有最大最小值,y也有最大最小值,这就可以确定矩形,上图

这样便很好理解了
点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
void solve()
{
int n;
cin>>n;
vector<pii>ve(n);
for(int i=0;i<n;i++) cin>>ve[i].first>>ve[i].second;
set<vector<int>>se;
for(int sz=1;sz<(1<<n);sz++)//从1开始代表不考虑点都不选的情况
{
vector<int>a(4);
int x1=-1,x2=55,y1=-1,y2=55;
for(int j=0;j<n;j++)
{
if((sz>>j)&1){
x1=max(x1,ve[j].first) ;
x2=min(x2,ve[j].first);
y1=max(y1,ve[j].second);
y2=min(y2,ve[j].second);
}
}
a[0]=x1,a[1]=y1,a[2]=x2,a[3]=y2;
se.insert(a);
}
cout<<se.size()+1;
}
int main()
{
solve();
}
L 加纳~
简单的模拟
点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n,m,ans,k;
cin>>n>>m;
cin>>k;
int cnt=k/n;
if(k-cnt*n==m) ans=cnt+1;
else ans=cnt;
cout<<ans;
}
int main()
{
solve();
}
posted on 2024-03-08 19:58 swj2529411658 阅读(17) 评论(0) 收藏 举报
浙公网安备 33010602011771号