C++小白训练第三天

C++小白训练第三天

以下为牛客挑战

今日收获

在 C++ 里,用标准输入流 std::cin 就能一次读两个以空白(空格、换行、制表符)分隔的字符串。

就是 ssr sss
int main() {
    std::string a, b;
    std::cin >> a >> b;      // 读入两个字符串
    std::cout << a << " " << b << '\n';
    return 0;
}
>> 遇到空白就停止,因此如果字符串本身含有空格,需要改用 std::getline 并自行处理分隔符。如果想读一整行再分割,可以:


如果想读一整行再分割,可以:
std::string line;
std::getline(std::cin, line);
std::size_t sp = line.find(' ');
std::string a = line.substr(0, sp);
std::string b = line.substr(sp + 1);

stoi函数 转换stio()

unordered_map当桶用,是不会去重的
 unordered_map<string,int>m;
 
 把{x,x-1,y,y-1,y+1,x+1},添加到tmap里
for(auto z:{x,x-1,y,y-1,y+1,x+1}){tmap.insert(z)这个相当于把元素添加进去一样就行了

学到了sort自定义排序
sort(s.begin()+1,s.end(),[&](auto & s1,auto & s2){
        return s1.size()<s2.size();

牛客小白月赛126

小红打舞萌

字符串转换

A-小红打舞萌_牛客小白月赛126

image-20260112212619733

直接读取字符串

解题代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
void solve(){
    string s1,s2,s3,s4;
    cin>>s1>>s2;
    s3=s1.substr(0,2);
    s4=s2.substr(0,2);
    int m=stoi(s3);
    int m1=stoi(s4);
    if(m>m1){
        cout<<"Yes"<<endl;
    }else if(m==m1){
        if(s1.size()>s2.size()){
            cout<<"Yes"<<endl;
        }else{
            cout<<"No"<<endl;
        }
    }else{
        cout<<"No"<<endl;
    }
};
signed main(){

	std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    TESTS{
        solve();
    };

	return 0;
}

小红写谱

B-小红写谱_牛客小白月赛126

环形“密码盘”最小代价题

image-20260112220541857

2
5
1 2 3 4 5
3
2 7 8
4
3

​ 这个题的解法有点抽象理解,我们直接先排一个顺序对吧,我们把最小代价先算出来,然后把他当成绳子,我们必要要保正连通,记得也要把最大的数和最小的数连的也搞好,然后算出总的来减去最大的就行了

image-20260112221356396

解题代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;

void solve(){
    int n;
    cin>>n;
    int sum=0;
    int max1=0;
    vector<int>a(n,0);
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a.begin(),a.end());
    for(int i=0;i<n-1;i++){
        int x=min(abs(a[i]-a[i+1]),8-abs(a[i]-a[i+1]));
        sum+=x;
        max1=max(max1,x);
    }
    int x=min(abs(a[0]-a[n-1]),8-abs(a[0]-a[n-1]));
    sum+=x;
    max1=max(max1,x);

    cout<<sum-max1<<endl;
};
signed main(){

	std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    TESTS{
        solve();
    };

	return 0;
}

小红出勤

C-小红出勤_牛客小白月赛126

image-20260112224726815

image-20260112224737673

2
3 5 2
pupa 15
quiq 12
startliner 4
pupa
quiq
3 5 1
pupa 15
quiq 12
startliner 4
startliner
7 12
-1

这个题我们最大值和最小值直接这样想

最小值,就是我们每一次都取p(每次最多能几个)个,这个一定是最小值

int mn=(int)((ss+p-1)/p);//这个是最小值,每天完成最小p刚好卡线,然后看看能完成几天。

最大值,我们就得算出他每次他必须要听的歌曲的最小值,相当于我只要最小的都满足了,那我每天就听他一个就行l,但是我得保证每天最多p个,所有约束条件如果

1ll*p*mx<ss,这个是不合理的,会超过这个

解题代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
void solve(){
   int n,p,k;
   cin>>n>>p>>k;
   int ss=0;
   unordered_map<string,int>m;
   for(int i=0;i<n;i++){
       string s;
       int t;
       cin>>s>>t;
       m[s]+=t;
       ss+=t;
   }
   int mx=ss;
   for(int i=0;i<k;i++){
       string s;
       cin>>s;
       mx=min(mx,m.count(s)?m[s]:0);//所有数量都去分派,假设都分配为1。
   }
   int mn=(int)((ss+p-1)/p);//这个是最小值,每天完成最小p刚好卡线,然后看看能完成几天。
   if(mx<mn||1ll*p*mx<ss){
        cout<<"-1"<<endl;
   }else{
       cout<<mn<<" "<<mx<<endl;
   }

};
signed main(){

	std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    TESTS{
        solve();
    };

	return 0;
}

小红越级(easy)

D-小红越级(easy)_牛客小白月赛126

image-20260113202711058

1
5 3
1 1
1 2
1 3
1 4
1 5
2
3
4
0 2 2

image-20260113202745912

这个题开始我想用这个统计个数做但是好像没有办法控制这个到底是相邻还是这么,所以我看了一下大佬的,瞬间给了我思路。

我们其实先定义一个数组并且把这些初始值都设置为n次,因为我们每个都有n个,对吧,所以最差的可能就是全是不适,所以我们去取n。

对每一组数据进行处理,例如,x的适合范围就是x,x-1,x+1,对这数的数组进行减1,我们就可以得到这些数的次数了在范围的次数。

先用set去了一下重复,因为x,y就是这样子,如果相等就直接去掉重复的

解题代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],pre[N];
void solve(){
    int n,q;
    cin>>n>>q;
    vector<int>s(n+4,n);
    for(int i=0;i<n;i++){
        int x,y;
        set<int>tmap;
        cin>>x>>y;
        for(auto z:{x,x-1,y,y-1,y+1,x+1}){tmap.insert(z);}
        for(auto z:tmap)s[z]--;
        }

    while(q--){
        int x;
        cin>>x;
        cout<<s[x]<<" ";
    }
    cout<<endl;
    }


signed main(){

	std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    TESTS{
        solve();
    };

	return 0;
}

牛客周赛 Round 126

小红的顺子构造

A-小红的顺子构造_牛客周赛 Round 126

image-20260113212818757

3
1 2 3 4 5

解题代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];

signed main(){

	std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin>>n;
    for(int i=n;i<=n+4;i++){
        cout<<i<<" ";
    }

	return 0;
}

小红的字符串构造(easy)

B-小红的字符串构造(easy)_牛客周赛 Round 126

image-20260113221052849

5 3
1
1
101
1011
1011000
101

这个题目直接看到有一个就是我们一定有两两前缀关系,看到可以找到一个适合的,按字符串长度排序,“-1”就是当我们要选的那个长度后面还有一样的长度的,就不行了。

排序了

bool cmpLen(const string& a, const string& b) {
    return a.size() < b.size();   // 短的排在前面
}

解题代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];

signed main(){

	std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,k;
    cin>>n>>k;
    vector<string>s(n+1);
    for(int i=1;i<=n;i++){
        cin>>s[i];
    }
    sort(s.begin()+1,s.end(),[&](auto & s1,auto & s2){
        return s1.size()<s2.size();
    });
    if(k+1<=n&&s[k+1]==s[k]){
        cout<<"-1"<<endl;
    }else{
        cout<<s[k]<<endl;
    }

	return 0;
}
posted @ 2026-01-13 22:20  Godjian  阅读(1)  评论(0)    收藏  举报