T3

题目要求:给定NNMM,找出最大满足以下要求的xx

  1. xx小于10^N^,且xx的每位数字都一致
  2. xxMM的倍数

数学知识:同余定理

(A+B)modC=AmodC+BmodC(A+B)\mod C=A\mod C+B\mod C

我们只需要循环遍历当整除时更新答案

#include<bits/stdc++.h>
using namespace std;
int main(){
    freopen("repeat.in","r",stdin);
    freopen("repeat.out","w",stdout);
    int n,m;
    cin>>n>>m;
    int idx=0,x;
    for(int i=1;i<=9;i++){
        int sum=0;
        for(int j=1;j<=n;j++){
            sum=(sum*10+i)%m;
            if(sum==0&&j>=idx){
                x=i;
                idx=j;
            }
        }
    }
    if(idx==0) cout<<-1;
    else{
        while(idx--) cout<<x;
    }
    return 0;
}

T4

题目要求:在二维平面中有NN个点,第ii个点的坐标为(xi,yi)(x_i,y_i) 求最大曼哈顿距离

曼哈顿距离

d=x1x2+y1y2d=|x_1-x_2|+|y_1-y_2|

1.x1>x2 and y1>y2x_1>x_2\ and \ y_1>y_2

d=(x1+y1)(x2+y2)d=(x_1+y_1)-(x_2+y_2)

其余3种情况与其类似 那么我们可以对于被减数取最大值,对于减数取最小值,相减的值为最大值

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+20;
int n;
long long sum1[N],sum2[N];
int main() {
	freopen("lenth.in","r",stdin);
	freopen("lenth.out","w",stdout);
	cin>>n;

	for (int i=1;i<=n;i++) {
		int x,y;
		cin>>x>>y;
		sum1[i]=x+y;
		sum2[i]=x-y;
	}
    sort(sum1+1,sum1+1+n);
    sort(sum2+1,sum2+n+1);

	cout<<max(sum1[n]-sum1[1],sum2[n]-sum2[1]);
	return 0;
}