cf1294E
题意简述:给一个矩阵,有两种操作可以进行
操作1:改变矩阵中一个元素的值
操作2:将矩阵中某一列的值循环下移
要求用最少的操作次数使得矩阵变成

题解:对于一列来说,我们肯定是先变化然后再循环下移,所以应该考虑变化哪些数字,而要知道变化哪些数字必须知道变化之后对应哪个循环,
比如3 1 4 ,可以变为 1 4 7 , 4 7 1 , 7 1 4 这三种,我们可以枚举他变成哪一种,然后计算需要的最少操作次数,这样明显会超时
反过来考虑,对于每一个元素来说,找他对哪几种最终的循环有贡献,也就说变成这种循环,他的值不需要改变,可以用dp[i]来表第i种循环,循环扫描每一个元素,更新dp数组就好
#include<bits/stdc++.h>
#define forn(i, n) for (int i = 0 ; i < int(n) ; i++)
#define fore(i, s, t) for (int i = s ; i < (int)t ; i++)
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pf2(x,y) printf("%d %d\n",x,y)
#define pf(x) printf("%d\n",x)
#define each(x) for(auto it:x) cout<<it<<endl;
#define pii pair<int,int>
using namespace std;
typedef long long ll;
const int maxn=4e5+5;
const int maxm=2e5+5;
const int inf=1e9; int n,m; vector<vector<int>> a; int dp[maxn]; int calc(vector<int> v,int col){
for(int i=0;i<n;i++)
dp[i]=0;
for(int i=0;i<v.size();i++){
int x=(v[i]-col)/m,y=v[i]%m==0?m:v[i]%m;
//cout<<x<<' '<<y<<endl;
if(y==col) {
if(x>=i) dp[x-i]++;
dp[x+n-i]++;
}
}
int re=1e9;
for(int i=0;i<n;i++)
re=min(re,(n-dp[i])+(n-i)%n);
// pf(re);
return re;
}
int main(){
cin>>n>>m;
a.resize(n,vector<int>(m,0));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
int ans=0;
for(int i=0;i<m;i++){
vector<int> v(n);
for(int j=0;j<n;j++)
v[j]=a[j][i];
ans+=calc(v,i+1);
}
pf(ans);
}
cf1294E的更多相关文章
随机推荐
- Day8-Python3基础-Socket网络编程
目录: 1.Socket语法及相关 2.SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道 ...
- IIS发布网站常见MIME扩展类型添加
# This file maps Internet media types to unique file extension(s). # Although created for httpd, thi ...
- centos7 手动设置时间
date -s "2020-02-03 23:13:00" hwclock -w clock -w
- Spring AOP源码分析--代理方式的选择
能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 年前写了一个面试突击系列的文章,目前只有redis相关的.在这个系列里,我整理了一些面试题与大家 ...
- 并发队列之ConcurrentLinkedQueue
本来想着直接说线程池的,不过在说线程池之前,我们必须要知道并发安全队列:因为一般情况下线程池中的线程数量是一定的,肯定不会超过某个阈值,那么当任务太多了的时候,我们必须把多余的任务保存到并发安全队列中 ...
- Android整理:SQlite数据库的使用以及通过listView显示数据
前言:上个月与同学一起做了一个简单的Android应用,这段时间正好没有很多事情所以趁热整理一下学习到的知识,刚开始学习Android还有很多不懂的地方,继续努力吧! 作业中需要用到数据库,当然首选A ...
- LIBCMTD.lib与libcpmtd冲突的解决方法。
error: 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int) ...
- 用EFCore的 FluentAPI 方式生成MySql 带注释的数据库表结构
采用的是net Core 3.1框架下的 的WebAPI项目. 1. 创建ASP.NET Core Web项目 2. 添加NuGet引用包,包如下 Microsoft.EntityFramewor ...
- 面试官:“看你简历上写熟悉 Handler 机制,那聊聊 IdleHandler 吧?”
一. 序 Handler 机制算是 Android 基本功,面试常客.但现在面试,多数已经不会直接让你讲讲 Handler 的机制,Looper 是如何循环的,MessageQueue 是如何管理 M ...
- yum仓库配置与内网源部署记录
使用yum的好处主要就是在于能够自动解决软件包之间的依赖.这使得维护更加容易.这篇文章主要就是记录部署内网源的操作过程以及yum工具如何使用 因为需要.数据库要从Oracle迁移至MySQL.在部署M ...