1.6 SMU Winter 2023 Round #2 (Div.2)

SMU Winter 2023 Round #2 (Div.2)

1760A - Medium Number

思路:排列后,输出第二大的数

int main(){

    int t,a[5];
    cin>>t;
    while(t--){
        for(int i=0;i<3;++i){
            cin>>a[i];
        }
        sort(a,a+3);
        cout<<a[1]<<'\n';
    }
    return 0;
}

 

1760B - Atilla's Favorite Problem

思路:找出字典序最大的字母

int main(){

    string s;
    int t,c;
    cin>>t;
    while(t--){
        cin>>c>>s;
        int ma=-1;
        for(int i=0;i<s.size();++i){
            int b=s[i]-'a'+1;
            ma=max(ma,b);
        }
        cout<<ma<<'\n';
    }
    return 0;
}

 

1759A - Yes-Yes?

思路:Y → e,e → s,s → Y,判断每个字符后是否如此

void solve(){
        bool k=true;
        for(int i=0;i<s.size()-1;++i){
                if(s[i]=='Y'&&s[i+1]!='e'||s[i]=='e'&&s[i+1]!='s'||s[i]=='s'&&s[i+1]!='Y')
            {
                k=false;break;
            }
        }
        if(k)cout<<"YES";
        else cout<<"NO";
    }

 

1759B - Lost Permutation

思路:算出1~max中没有的数的和,从max+1开始加直到满足条件

void solve(){
        for(int i=0;i<m;++i){
            cin>>x;
            ma=max(ma,x);
            a[x]=true;
        }
        int all=0;
        for(int i=1;i<=ma;++i){
            if(!a[i])all+=i;
        }
        if(all<s) {
            for (int i = ma + 1;; ++i) {
                all += i;
                if (all >= s)break;
            }
        }
        if(all==s)cout<<"YES"<<'\n';
        else cout<<"NO"<<'\n';
    }

 

1760D - Challenging Valleys

思路:存所有不同的数,统计形成“山谷”的数量,为1则yes

for(int i=0;i<x;++i){
            cin>>m;
            if(i==0||m!=a.back())
                a.push_back(m);
        }

for(int i=0;i<a.size();++i){
            if((i==0||a[i-1]>a[i])&&(i==a.size()-1||a[i]<a[i+1]))
                ans++;
        }

if(ans==1)cout<<"YES"<<'\n';
else cout<<"NO"<<'\n';

 

1760E - Binary Inversions

思路:1.原数组的值  2.将第一个0 → 1 后的值  3.将最后一个1 → 0 后的值 ,取最大值

int x=find(a.begin(),a.end(),0)-a.begin(),y=find(a.rbegin(),a.rend(),1)-a.begin();
    
    for(int i=n-1;i>=0;--i){
        if(a[i]==0)s++;
        if(a[i]==1)all+=s;
    }
    ans=max(ans,all);

 

1760F - Quests

思路:先降序排列,求出前缀和,k从 ’可以为任意值的最小值‘ 开始遍历,最大情况下,可以将d分成d/k段,用前缀和求出总共的最大和s,若满足s>=c,即可知道k的范围,反之不存在

int cmp(int a,int b){
    return a>b;
}
int main(){
    long long t;
    cin>>t;
    while(t--){
        long long n,c,d,m;
        cin>>n>>c>>d;
        vector<int>a;
        vector<long long>h(n+5,0);
        a.push_back(0x3f3f3f3f);
        for(int i=1;i<=n;++i){
            cin>>m;
            a.push_back(m);
        }
        sort(a.begin(),a.end(),cmp);
        for(int i=1;i<=n;++i)
            h[i]=h[i-1]+a[i];
        h[0]=0;
        int k=d;
        while(k>=1){
            int i=k;
            if(n<k)i=n;
            int x=d/k,y=d%k;
            if(y>n)y=n;
            long long s=h[i]*x+h[y];
            if(s>=c){
                if(k==d)cout<<"Infinity\n";
                else cout<<k-1<<'\n';
                break;
            }
            k--;
        }
        if(k<1)cout<<"Impossible\n";
    }
}

 

1760C - Advantage

思路:每次找出除自己以外的最大值

int main(){

    int t,x,b[N];
    cin>>t;
    while(t--){
        cin>>x;
        vector<pair<int,int>>a(x);
        for(int i=0;i<x;++i){
            cin>>a[i].first;
            a[i].second=i;
            b[i]=a[i].first;
        }
        sort(a.begin(),a.end());
        int k;
        for(int i=0;i<x;++i){
            k=x-1;
            while(a[k].second==i){
                k--;
            }
            cout<<b[i]-a[k].first<<' ';
        }cout<<'\n';
    }
    return 0;
}

 

 

1759E - The Humanoid

思路:对原序列排列后,从小的开始,分别算乘以2和3后的答案

int solve(int u,long long hh,int s2,int s3){
    if(u==n)return 0;
    if(hh>a[u])return solve(u+1,hh+(a[u]>>1),s2,s3)+1;
    //两种情况
    int ans2= s2? solve(u,hh*2,s2-1,s3) : 0;
    int ans3= s3? solve(u,hh*3,s2,s3-1) : 0;
    return max(ans2,ans3);
}

while(t--){
        cin>>n>>h;
        for(int i=0;i<n;++i)cin>>a[i];
        sort(a,a+n);
        cout<<solve(0,h,2,1)<<'\n';//a[]从小的开始,更新h,*2,*3
    }

 

 1759D - Make It Round

思路:一对2和5可以凑10,先统计n中2和5的个数,在小于m的基础上,补齐2或5,尽可能使个数相同

int main(){
    ll t,m,n;
    cin>>t;
    while(t--){
        cin>>n>>m;
        int nn=n;
        int cnt2=0,cnt5=0;
        ll k=1;
        while(n>0&&n%2==0){
            n/=2;cnt2++;
        }
        while(n>=0&&n%5==0){
            n/=5;cnt5++;
        }
        while(cnt2<cnt5&&k*2<=m){
            cnt2++;k*=2;
        }
        while(cnt5<cnt2&&k*5<=m){
            cnt5++;k*=5;
        }
        while(k*10<=m){
            k*=10;
        }
        if(k==1)cout<<nn*m<<'\n';
        else{
            k*=m/k;
            cout<<nn*k<<'\n';
        }
    }
    return 0;
}

 

1759C - Thermostat

思路:

有5种可能:

1.a=b

2.一步: |a-b| ≤ x 

3.两步: |a-l|≤x|b-l|≤x |a-r|≤x|a-r|≤x,即a→l→b 或 a→r→b 

4.三步:a→l→r→b 或 a→r→l→b 

5. -1

int main(){
    ll t,l,r,x,a,b;
    cin>>t;
    while(t--){
        cin>>l>>r>>x>>a>>b;
        if(a==b)cout<<"0"<<'\n';
        else if(abs(a-b)>=x)cout<<"1"<<'\n';
        else if(min(a,b)-l>=x||r-max(a,b)>=x)cout<<"2"<<'\n';
        else if(r-b>=x&&a-l>=x||r-a>=x&&b-l>=x)cout<<"3"<<'\n';
        else cout<<"-1\n";
    }
    return 0;
}

 

1760G - SlavicG's Favorite Problem

思路:分别对a,b求到每个点的x,若存在相同的,说明a可以在最多跳跃一次的情况到达b,用set记录dfs a时求出的x,dfs b时判断即可

const int N=2e5+10;
int n,a,b;
vector<pair<int,int> >ve[N];
set<int> s;
void dfs1(int u,int fa,int x){
    if(u==b)return ;
    s.insert(x);
    for(auto e:ve[u]){
        int v=e.first,w=e.second;
        if(v==fa)continue;
        dfs1(v,u,w^x);
    }
}
bool dfs2(int u,int fa,int x){
    if(u!=b&&s.count(x))return true;
    for(auto e:ve[u]){
        int v=e.first,w=e.second;
        if(v==fa)continue;
        if(dfs2(v,u,x^w))return true;
    }
    return false;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        s.clear();
        cin>>n>>a>>b;
        for(int i=1;i<=n;++i)ve[i].clear();
        for(int i=1;i<n;++i){
            int u,v,w;
            cin>>u>>v>>w;
            ve[u].push_back({v,w});
            ve[v].push_back({u,w});
        }
        dfs1(a,-1,0);
        if(dfs2(b,-1,0))cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}

 


posted @ 2023-01-07 15:39  bible_w  阅读(28)  评论(0编辑  收藏  举报