CODEFORCE 1003 DIV4

这一场的div4,怎么说呢,怎么感觉比div3还难很多,算了就直接开始讲吧。
第一题,不难,可以直接用python把他水掉。

n=int(input())
for i in range(n):
    s=input()
    s=s[0:-2:]+'i'
    print(s)

第二题是说告诉你有一个字符串,你可以选择两个相邻的元素进行如下的操作,首先将第二个元素删掉,然后将第一个元素修改成任意想要的字符串,执行这一操作的条件是第一个元素和第二个元素相等,在这里,如果我想要一直执行这一操作,要做的就是去不断的删除元素,同时把第一个元素变成与前一个元素相同的元素,所以在这里,如果出现一个连续的元素,他就一定会在最后被删掉长度为1,而如果没有连续的元素,那么就没有办法执行删除。最后字符串只会保持在原长度。
(一开始没有看明白题目在说啥,浪费了很多时间)

#include<bits/stdc++.h>
using namespace std;
 
void sol(){
    string s;
    cin>>s;
    int flag=0;
    for(int i=1;i<s.size();i++){
        if (s[i]==s[i-1]){
            flag=1;
        }
    }
    if(flag==1){
        cout<<1<<endl;
    }
    else{
        cout<<s.size()<<endl;
    }
}
 
int main(){
    int T;scanf("%d",&T);
    while(T--){
        sol();
    }
}

对于C题,他这个是一个C1和C2是具有相同的性质的,所以就放在一起来讲一下了。
对于这道题,由于我要让整个数列变成一个不下降的数列,那么对于一个数字,为了维护这个数字,可以选择进行一个操作,将其变成b[j]-a[i]。在这里,由于在simple version 里面会出现b的长度只有1。所以在这里,为了保证后面的数字尽可能的大于前面的数字,那么我需要将前面的数字尽可能的小,所以,在这里,对于当前点a[i],我需要对其与b[j]-a[i]来比较,然后,如果
b[j]-a[i]可以满足>=a[i-1]且可以使数字变得更小,那么就更新当前的数字。
可以知道代码如下。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
inline void sol(){
    int n,m;
    cin>>n>>m;
    vector<int> a(n+2),b(m+1);

    a[0]=INT_MIN;
    a[n+1]=INT_MAX;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        cin>>b[i];
    }

    a[1]=min(a[1],b[1]-a[1]);

    for(int i=2;i<=n;i++){
        int tar=b[1]-a[i];
        if(a[i-1]>a[i]){
            if(a[i-1]<=tar) a[i]=tar;
            else{
                cout<<"NO"<<endl;
                return;
            }
        } else if(a[i-1]<=tar) a[i]=min(a[i],tar);
    }
    for(int i=1;i<=n;i++){
        if(a[i-1]>a[i] || a[i]>a[i+1]){
            cout<<"NO"<<endl;
            return;
        }
    }
    cout<<"YES"<<endl;
    return;
}

int main(){
    int T;
    cin>>T;
    while(T--){
        sol();
    }
}

那么对于b数组的长度不等于1的,怎么做呢?其实我们的目的就是去让当前的数字a[i]尽可能的小,那么对于b[j]-a[i]>=a[i-1],那么我要去让b[j]尽可能接近a[i]+a[i+1],这样子就可以满足了,在这里,由于b可以任意选择,所以对数组b排序+二分就可以了。剩下的思路和第一题一样

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

void sol(){
    int n,m;
    cin>>n>>m;
    vector<int> a(n+2),b(m+1);

    a[0]=INT_MIN;
    a[n+1]=INT_MAX;

    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        cin>>b[i];
    }
    sort(b.begin()+1,b.end());

    a[1]=min(a[1],b[1]-a[1]);

    for(int i=2;i<=n;i++){
        auto it=lower_bound(b.begin()+1,b.end(),a[i]+a[i-1]);
        int new_b;
        if(it!=b.end()){
            new_b=*it;
        }
        else{
            continue;
        }
        int tar=new_b-a[i];

        if(a[i-1]>a[i]){
            if(a[i-1]<=tar) a[i]=tar;
            else{
                cout<<"NO"<<endl;
                return;
            }
        } else if(a[i-1]<=tar) a[i]=min(a[i],tar);
    }

    // for(int i=1;i<=n;i++){
    //     cout<<a[i]<<" ";
    // }cout<<endl;


    for(int i=1;i<=n;i++){
        if(a[i-1]>a[i] || a[i]>a[i+1]){
            cout<<"NO"<<endl;
            return;
        }
    }
    cout<<"YES"<<endl;
    return;
}

int main(){
    int T;
    cin>>T;
    while(T--){
        sol();
    }
}

D题比较简单,感觉比C题简单。
这个题若是想要让这些数组的和的值尽可能大,那么我就要让大的数组排在前面,这样子他们的贡献就会大一点,然后就可以写出代码了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+7;

bool cmp(vector<ll> a,vector<ll> b){
    ll sum_a=0;
    ll sum_b=0;
    for(ll i:a) sum_a+=i;
    for(ll i:b) sum_b+=i;
    return sum_a>sum_b;
}

vector<vector<ll>> a;
inline void sol(){
    a.clear();
    vector<ll> sum1;
    ll n,m;
    cin>>n>>m;
    for(ll i=0;i<n;i++){
        vector<ll> a1;
        for(ll j=0;j<m;j++){
            ll num;cin>>num;
            a1.push_back(num);
        }
        a.push_back(a1);
    }
    sort(a.begin(),a.end(),cmp);

    sum1.push_back(0);
    for(ll i=0;i<n;i++){
        for(ll j=0;j<m;j++){
            sum1.push_back(a[i][j]);
        }
    }
    
    for(ll i=1;i<sum1.size();i++){
        sum1[i]=sum1[i]+sum1[i-1];
        // cout<<sum1[i]<<" ";
    } // cout<<endl;

    ll ans=0;
    for(ll i:sum1){
        ans+=i;
    }

    cout<<ans<<endl;
}

int main(){
    ll T;cin>>T;
    while(T--){
        sol();
    }
}

本文作者:芙芙芙啊

本文链接:https://www.cnblogs.com/fufufuf/p/18714982

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @ 2025-02-19 20:29  fufufuf  阅读(4)  评论(0编辑  收藏  举报