題目連結
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;
}