Codeforces Round #675 (Div. 2) A-B

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值