天天看點

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;
}