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的更多相关文章
随机推荐
- 生成URL(而不是链接) Generating URLs (and Not Links) | 在视图中生成输出URL |高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼
结果呢:
- 使用Razor表达式 使用条件语句 来自 精通ASP-NET-MVC-5-弗瑞曼
- 链接拼接的方法(用于解决同一个脚本返回两种不同的url链接的问题)
实例一: 上图所示 爬虫返回的链接有一部分带有http前缀,有一部分没有,且也不知道具体哪些链接会出现没有前缀的情况 后面如果通过返回链接进行再次访问,那么肯定会出现报错的问题 思路: 判断 返回值内 ...
- CF572_Div2_F
题意 http://codeforces.com/contest/1189/problem/F 思考 由于是子序列,答案只跟选法有关,与顺序无关,先排序. 直接计算答案比较困难.联想到期望的无穷级数计 ...
- Educational Codeforces Round 80 (Rated for Div. 2)部分题解
A. Deadline 题目链接 题目大意 给你\(n,d\)两个数,问是否存在\(x\)使得\(x+\frac{d}{x+1}\leq n\),其中\(\frac{d}{x+1}\)向上取整. 解题 ...
- 为什么不在spring容器管理controller
Spring容器与SpringMVC容器 1.疑问:为什么不用spring去管理所有类? 我们配置springMVC 中,为什么controller不直接交给spring 管理而要spring MVC ...
- linux系统中的硬链接和软链接
首先我们需要了解linux下硬链接以及软连接的基本概念.硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用.软链接:也称为符号链接,新建的文件以“路径”的形式来表示另 ...
- [信息安全] 05 X.509 公钥证书的格式标准
X.509是# 公钥证书的格式标准, 广泛用于TLS/SSL安全通信或者其他需要认证的环境中.X.509证书可以由# CA颁发,也可以自签名产生. 1 Overview {#1-overview} X ...
- Scala 学习(10)之「集合 」
数组 定长数组 Array:采用()访问,而不是[],下标从 0 开始. val array1 = new Array[String](5) //创建数组 println(array1) //返回数组 ...
- Nice to meet you for the first time .Why do I write blog!
他们说我不修边幅,因为他们没看到我对细节的追求,他们说我技术宅,因为他们看不懂我的悲欢,他们说我无趣,是因为她们不知道,我在让世界变得更有趣,我把误解拿来自黑,我用工作承载兴趣,我是程序员,是用代码编 ...