题目链接
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;
}