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个位置可以修改多少个数。

  1. i==1 [1,a2)
  2. i==n [an+1,k]
  3. 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]的倍数。

扫描二维码关注公众号,回复: 12883493 查看本文章
#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;
}

猜你喜欢

转载自blog.csdn.net/qq_43566782/article/details/113809122