Codeforces Round #675 (Div. 2)
A. Fence
题意:
给定 三条边的长度 让你求能组成四边的第四条边长度
其中三边不共线
问题分析:
四边形的一个性质:三边之和大于第四边
注意开 long long
AC代码:
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<sstream>
#include<algorithm>
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a));
#define lowbit(a) ((a)&-(a))
const ll inf=0x3f3f3f3f;//1061109567,2*未超int,allinf=mem(a,0x3f,sizeof(a));
const int N=1e6+10;
long long a[N];
int main(){
//#define io
#ifdef io
freopen("in.txt","r",stdin);
#endif
cin.tie(0);
ll t;
cin>>t;
while(t--){
ll x,y,z;
cin>>x>>y>>z;
cout<<(ll)(x+y+z-1)<<endl;
}
return 0;
}
B. Nice Matrix
题意:
给你一个N*M的数字矩阵
要求每行每列都构成回文串
可以变换任意位置的数值(变化值为1)
求最小的变换次数
问题分析:
先看一个点 会发现 同行有一个必须和他相等
这个点的 同列也必须和他相等
相对的 同列的呢一行的 回文位置也必须和这个点相等
这样我们就可以知道 最优的处理办法就是
将这第个四个点变成
他们中数字数字出现
次数最多的呢个数字
因为 行列可能存在奇数的情况所以 这样就不是四个点了,相当于是2个点
同理 不相等 就需要变化 所以要特判 行列的 奇数情况
看图
奇数情况:这是都是奇数 可能会出现 3*8
或者8*3
这种类似的情况
偶数情况:
关于位置信息
我二维数组存的矩阵是从a[1][1]
开始的
偶数情况的四个点
a[i][j]=a[i][m-j+1]=a[n-i+1][j]=a[n-i+1][m-j+1]
奇数的时候就是奇数的行或者列不变,然后另一个行、列扫一遍
一些细节啥的 看代码注释:
AC代码:
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<sstream>
#include<algorithm>
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a));
#define lowbit(a) ((a)&-(a))
const ll inf=0x3f3f3f3f;//1061109567,2*未超int,allinf=mem(a,0x3f,sizeof(a));
const int N=1e3+10;
long long a[N][N];
ll flag[10];
int main(){
//#define io
#ifdef io
freopen("in.txt","r",stdin);
#endif
cin.tie(0);
int t;
cin>>t;
while(t--){
ll sum=0;
ll n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){//1,1开始
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
ll xx=0;//用来记录回文数字
for(int i=1;i<=n/2;i++){
for(int j=1;j<=m/2;j++){//因为回文 还有奇偶直接/2下取整就行
flag[1]=a[i][j];//用来记录 以后直接for循环遍历 简单点
flag[2]=a[i][m-j+1];
flag[3]=a[n-i+1][j];
flag[4]=a[n-i+1][m-j+1];
ll ans=5000000000;//记录最小变化的值 取值1e9 尽量往大开
for(int k=1;k<5;k++){
ll ss=0;//用来记录四个数变为每一个需要的 变换次数
for(int l=1;l<5;l++){
ss+=abs(flag[k]-flag[l]);
}
if(ss<ans){//存在更小的幻变化
ans=ss;
xx=flag[k];//记录更优
}
}
sum+=ans;//记录最优变化次数
}
}
//列数为奇数
if(m%2){
ll w=m/2+1;
for(int i=1;i<=n/2;i++){//扫描行
if(a[i][w]!=a[n-i+1][w]){
sum+=abs(a[i][w]-a[n-i+1][w]);
}
}
}
//行数为奇数
if(n%2){
ll w=n/2+1;
for(int i=1;i<=m/2;i++){//扫描列
if(a[w][i]!=a[w][m-i+1]){
sum+=abs(a[w][i]-a[w][m-i+1]);//
}
}
}
cout<<sum<<endl;
}
return 0;
}