Codeforces Round #701 (Div. 2)
作者:互联网
A. Add and Divide
被数据范围吓到了,实际上最优情况是b+x之后一直选择第一种肯定是最优的。而且这个x肯定很小。
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
typedef long long ll;
int res;
void dfs(ll a, ll b,int step)
{
if(a==0){
res=min(res,step);
return ;
}
if(b<=1)dfs(a,b+1,step+1);
else{
dfs(a/b,b,step+1);
if(b<=10){
dfs(a,b+1,step+1);
}
}
}
int main() {
int t;
ll a,b;
cin>>t;
while(t--){
cin>>a>>b;
if(a==1&&b==1){
cout<<2<<'\n';continue;
}
res=0x3f3f3f3f;
dfs(a,b,0);
cout<<res<<'\n';
}
return 0;
}
B. Replace and Keep Sorted
一开始理解错题意了。最重要的就是[l,r]中只有一个是不相同的。
对于第i个位置可以修改多少个数。
- i==1 [1,a2)
- i==n [an+1,k]
- 1<i<n (a(i-1),a(i+1))
那么递推一个式子:对于[l,r].
l l+1 l+2 l+3 r
a(l+1)-2 a(l+2)-al-2 a(l+3)-a(l+1)-2 ar-a(l+2)-2 k-a(l+3)-1
化简得:ar-al-2*(r-l)+k-1
看到有前缀和做法:实际上就是上述式子整理得:
a(l+1)+a(l+2)+a(l+3)+a(r)-{al+a(l+1)+a(l+2)+a(l+3)}-2*(r-l)+k-1
==sum[r]-sum[l]-(sum[r-1]-sum[l-1])-2*(r-l)+k-1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int a[N];
int main()
{
int n,q,k,l,r;
cin>>n>>q>>k;
for(int i=1;i<=n;i++)cin>>a[i];
while(q--){
cin>>l>>r;
cout<<a[r]-a[l]-2*(r-l)+k-1<<'\n';
}
return 0;
}
D. Multiples and Power Differences
对于a数组大小在[1,16]。构造b数组,b数组和a数组等长等宽,然后b[i][j]%a[i][j]==0,也就是b[i][j]是a[i][j]的倍数,b数组中相邻元素差的绝对值是一个整数k的4次方。k>=1。
首先b[i][j]是a[i][j]的倍数,因为a[i][j]的范围1 ~16,那么我们求1 ~16的最小公倍数720720
,不管a[i][j]填多少,都能保证b[i][j]%a[i][j]==0,然后我们构造(坐标之和奇数0,偶数1)
010101
101010
720720 x 720720 x
x 720720 x 720720
其次构造abs(相邻元素之差)=k4。令720720-x=a[i][j]4,因为720720是a[i][j]的倍数,a[i][j]^4 也是a[i][j]的倍数,那么x=720720-a[i][j]^4 同样也是a[i][j]的倍数。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[505][505];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int t=a[i][j];
if((i+j)&1)cout<<720720<<' ';
else cout<<720720-t*t*t*t<<' ';
}
cout<<'\n';
}
return 0;
}
标签:cin,int,ll,701,long,Codeforces,720720,Div,sum 来源: https://blog.csdn.net/qq_43566782/article/details/113809122