hey_left 15 Codeforces Round 835 (Div. 4)

题目链接

A.

总和-最小值-最大值即为中间数

#include <bits/stdc++.h>
using namespace std;

#define int long long
void solve(){
    int a,b,c;cin>>a>>b>>c;
    cout<<a+b+c-min({a,b,c})-max({a,b,c})<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

B.

遍历,记录最大字符

#include <bits/stdc++.h>
using namespace std;

#define int long long
void solve(){
    int n;cin>>n;
    string s;cin>>s;
    int ans=0;
    for(int i=0;i<s.size();i++){
        if(s[i]-'a'>ans){
            ans=s[i]-'a';
        }
    }
    cout<<ans+1<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

C.

若最大值不止一个,那么每个数与最大值的差就是答案
若最大值只有一个,那么还要一个次大值,最大值的答案是最大值与次大值的差

#include <bits/stdc++.h>
using namespace std;

#define int long long
void solve(){
    int n;cin>>n;
    vector<int>s(n+1);
    int ma=-1,cnt=0,maa=-1;
    for(int i=1;i<=n;i++){
        cin>>s[i];
        if(s[i]>ma){
            maa=ma;
            ma=s[i];
            cnt=1;
        }else if(s[i]==ma){
            cnt++;
        }else if(s[i]>maa)maa=s[i];
    }
    for(int i=1;i<=n;i++){
        if(s[i]==ma){
            if(cnt>1){
                cout<<0<<' ';
            }else cout<<s[i]-maa<<' ';
        }else cout<<s[i]-ma<<' ';
    }
    cout<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

D.

可以把边界设为无穷大
若出现一个数比前一个数小,再出现一个数比前一个数大,则山谷+1
若山谷大于1,则是NO

#include <bits/stdc++.h>
using namespace std;

#define int long long
void solve(){
    int n;cin>>n;
    vector<int>a(n+5);
    for(int i=1;i<=n;i++)cin>>a[i];
    a[n+1]=0x3f3f3f3f;
    int cnt=0;
    bool f=0;
    for(int i=2;i<=n+1;i++){
        if(a[i]>a[i-1]){
            if(f==0){
                cnt++;
                f=1;
            }
        }else if(a[i]==a[i-1]){
            continue;
        }
        else f=0;
    }
    if(cnt==1){
        cout<<"YES"<<'\n';
    }else cout<<"NO"<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

E.

要让反转数多,就是尽量1都在前面,0都在后面
那么我们把第一个0变成1或把最后一个1变成0,或者不变
3种情况分别讨论,取最大反转数

#include <bits/stdc++.h>
using namespace std;

#define int long long
void solve(){
    int n;cin>>n;
    vector<int>a(n+1),b(n+1),c(n+1);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[i]=a[i];
        c[i]=b[i];
    }
    for(int i=1;i<=n;i++){
        if(a[i]==0){
            a[i]=1;
            break;
        }
    }
    int sum1=0,cnt_1=0;
    for(int i=1;i<=n;i++){
        if(a[i]==1)cnt_1++;
        else sum1+=cnt_1;
    }
    for(int i=n;i>=1;i--){
        if(b[i]==1){
            b[i]=0;
            break;
        }
    }
    cnt_1=0;
    int sum2=0;
    for(int i=1;i<=n;i++){
        if(b[i]==1)cnt_1++;
        else sum2+=cnt_1;
    }
    int sum3=0;
    cnt_1=0;
    for(int i=1;i<=n;i++){
        if(c[i]==1)cnt_1++;
        else sum3+=cnt_1;
    }
    cout<<max({sum2,sum1,sum3})<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

F.

d天都用最大值都不够,就是不可能
min(d,n)的所有值加起来,也就是无需重复使用,那么是无穷大
其余情况二分天数

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;
bool cmp(int x,int y){
    return x>y;
}
void solve(){
    int n,c,d;cin>>n>>c>>d;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a.begin()+1,a.end(),cmp);
    if(a[1]*d<c){
        cout<<"Impossible"<<'\n';
        return ;
    }
    int sum=0;
    vector<int>pre(n+1);
    for(int i=1;i<=min(n,d);i++){
        sum+=a[i];
        pre[i]=pre[i-1]+a[i];
    }
    if(sum>=c){
        cout<<"Infinity"<<'\n';
        return ;
    }
    int l=0,r=N,mid;
    int ma=-1;
    while(l<=r){
        mid=(l+r)/2;
        int x=d%(mid+1);
        if(pre[min(n,x)]+d/(mid+1)*pre[min(n,mid+1)]>=c){
            l=mid+1;
            ma=max(ma,mid);
        }
        else r=mid-1;
    }
    cout<<ma<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

G.

分别以a,b为起点搜一遍,记录出现的异或结果
若有的值出现了2次及以上,则可以
注意a搜到b的时候要跳过
注意特判,初始mp[0]=1

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
map<int,int>mp;
vector<pair<int,int>>g[N];
int n,a,b;
void dfs1(int u,int fa,int res){
    for(int i=0;i<g[u].size();i++){
        int y=g[u][i].first;
        if(y==fa)continue;
        if(y==b)continue;
        mp[res^g[u][i].second]++;
        dfs1(y,u,res^g[u][i].second);
    }
}
bool f=0;
void dfs2(int u,int fa,int res){
    for(int i=0;i<g[u].size();i++){
        int y=g[u][i].first;
        if(y==fa)continue;
        if(mp[res^g[u][i].second]){
            f=1;return ;
        }
        dfs2(y,u,res^g[u][i].second);
    }
}
void solve(){
    mp.clear();
    mp[0]++;
    cin>>n>>a>>b;
    for(int i=1,u,v,w;i<n;i++){
        cin>>u>>v>>w;
        g[u].push_back({v,w});
        g[v].push_back({u,w});
    }
    f=0;
    dfs1(a,0,0);
    dfs2(b,0,0);
    if(f){
        cout<<"YES"<<'\n';

    }else cout<<"NO"<<'\n';
    for(int i=1;i<=n;i++)g[i].clear();

}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}
posted @ 2024-01-24 21:44  WW爆米花  阅读(4)  评论(0编辑  收藏  举报