Codeforces Round #675解题报告

题目链接

A、Fence

水题,多种做法。

//可能解法不是常规思路。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    
    
    int t;
    cin >> t;
    while(t--){
    
    
        ll a,b,c;
        cin >> a >> b >> c;
        int minn = min(a,min(b,c));
        cout << a+b+c-2*minn <<endl;
    }
    return 0;
}

B、Nice Matrix

题意:给定一个矩阵,要使这个矩阵每一行每一列都是回文的,问需要操作几步,每步只能将一个数加一或减一。
思路:n行m列的矩阵,a[i][j]这个位置的数字只需要考虑与它对应的另外三个位置即可,即a[i][m-j-1],a[n-1-i][j],a[n-1-i][m-1-j],找这四个数的中位数即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[101][101];
int main()
{
    
    
    int t,m,n;
    cin >> t;
    while(t--){
    
    
        cin >> n >> m;
        ll sum = 0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin >> a[i][j];
        for(int i=1;i<=(n+1)/2;i++){
    
    
            for(int j=1;j<=(m+1)/2;j++){
    
    
                vector<ll>temp;
                temp.push_back(a[i][j]);
                temp.push_back(a[i][m-j+1]);
                temp.push_back(a[n+1-i][j]);
                temp.push_back(a[n+1-i][m+1-j]);
                sort(temp.begin(),temp.end());
                ll tt = temp[1],ss=0;
                for(auto ttt:temp)
                    ss += abs(tt-ttt);
                if((n%2==1&&i==(n+1)/2)||(m%2==1&&j==(m+1)/2))
                    sum+=ss/2;
                else sum+=ss;
            }
        }
        cout << sum <<endl;
    }
    return 0;
}

C. Bargain

题意:给定一个数字(贼大,0 < n < 1 0 1 0 5 10^{10^5} 10105),操作若干次,每次移除它的子串,留下的数字重新拼接后累加, 求最终的结果对1e9+7取模。
思路:这个题其实主要是思维题目,找到其中的规律或者说组合,在第i位判断i位之前的移除情况和i位之后的移除情况,逐位判断即可。具体可以看大佬推导过程:参考博客

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+7;
char str[100010];
ll f[100010],p10[100010];
ll res(ll x){
    
    
    return x*(x-1)/2%mod;
}
int main(){
    
    
    cin >> (str+1);
    ll n=strlen(str+1);
    p10[0]=1;
    for(int i=1;i<=100005;i++){
    
    
        p10[i]=p10[i-1]*10;
        p10[i]%=mod;
    }
    f[0]=1;
    for(int i=1;i<=100005;i++){
    
    
        f[i]=f[i-1]+(i+1)*p10[i];
        f[i]%=mod;
    }
    ll ans=0;
    for(int i=1;i<=n;i++){
    
    
        ll pre=res(i)*(str[i]-'0')%mod*p10[n-i];
        ll be=(str[i]-'0')*f[n-i-1];
        ans+=pre+be;
        ans%=mod;
    }
    cout << ans <<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45949914/article/details/108933746