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

    科技2022-08-15  90

    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; }
    Processed: 0.018, SQL: 9