题目大意:

给定一个n*m的矩阵

可以更改任意一个位置的值

也可以选择一整列全部往上移动一位,最上方的数移动到最下方

问最少操作多少次可以把这个矩阵移动成

1 2 3 ... m

m+1 m+2 m+3 ... 2m

...

(n-1)m+1 (n-1)m+2 (n-1)m+3 ... nm

解题思路:

如果一个数大于n*m,或者这个数不属于这一列((d-1)%m!=j)
那么这个数只能进行改变值的操作
存完后以列为单位分开求答案
用cnt[i]记录如果这一列移动k次的话,有多少数的值不需要进行更改
比如一列有10个元素,在向上移动5次后共有7个值回到了应该在的位置,那么此时n=10,cnt[5]=7
总共的操作次数为5+10-7=8次
由i+n-cnt[i]计算得来
所以在每次处理完cnt后遍历0到n-1求最优解,累加得出答案即可
在处理时,(v[j][i]-1)/m求出v[j][i]这个数原本应该在第几行
那么它的移动次数便是(i-d+n)%n
或者分开讨论
i>=d -> i-d
i<d -> i+n-d

#include<bits/stdc++.h>
using namespace std;
vector<int> v[];
int cnt[];
void solve(){
int n,m,i,j,d,ans=,ansd;
cin>>n>>m;
for(i=;i<n;i++)
for(j=;j<m;j++){
cin>>d;
if((d-)%m!=j||d>n*m)
d=;//标记必须进行更改值
v[j].emplace_back(d);
}
for(j=;j<m;j++){
memset(cnt,,n*sizeof(int));
for(i=;i<n;i++)
if(v[j][i]){
d=(v[j][i]-)/m;
cnt[(i+n-d)%n]++;//计算如果要移动到应该在的位置需要移动几步
}
ansd=0x3f3f3f3f;
for(i=;i<n;i++)
ansd=min(ansd,i+n-cnt[i]);//寻找最优解
ans+=ansd;
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio();
cin.tie();cout.tie();
solve(); return ;
}

Codeforces 1294E - Obtain a Permutation的更多相关文章

  1. [Codeforces #615 div3]1294E Obtain a Permutation

    Before the Beginniing 本文为 Clouder 原创文章,原文链接为Click,转载时请将本段放在文章开头显眼处.如进行了二次创作,请明确标明. 由本人转载于博客园. 题意分析 C ...

  2. U - Obtain a Permutation CodeForces - 1294E 思维

    题解: 注意每一列与每一列之间互不影响,所以贪心地求出没一列的最小操作值,然后累加起来. 怎么求没一列的最小值呢?维护一个数组same表示其中same[i]=j表示将该序列向上翻滚i次有j个元素归位, ...

  3. Codeforces 500B. New Year Permutation[连通性]

    B. New Year Permutation time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  4. Codeforces 691D Swaps in Permutation

    Time Limit:5000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Prac ...

  5. [Codeforces 864D]Make a Permutation!

    Description Ivan has an array consisting of n elements. Each of the elements is an integer from 1 to ...

  6. Codeforces 500B New Year Permutation( Floyd + 贪心 )

    B. New Year Permutation time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  7. codeforces 500B.New Year Permutation 解题报告

    题目链接:http://codeforces.com/problemset/problem/500/B 题目意思:给出一个含有 n 个数的排列:p1, p2, ..., pn-1, pn.紧接着是一个 ...

  8. codeforces B. Levko and Permutation 解题报告

    题目链接:http://codeforces.com/problemset/problem/361/B 题目意思:有n个数,这些数的范围是[1,n],并且每个数都是不相同的.你需要构造一个排列,使得这 ...

  9. 【搜索】【并查集】Codeforces 691D Swaps in Permutation

    题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交 ...

随机推荐

  1. Java中定义常量(Constant) 的几种方法

    为了方便大家交流Spark大数据,浪尖建了微信群,目前人数过多,只能通过浪尖或者在群里的朋友拉入群.纯技术交流,偶有吹水,但是打广告,不提醒,直接踢出.有兴趣加浪尖微信. 常量使用目的 1,为什么要将 ...

  2. linux 命令之 objdump 简单使用

    objdump 介绍 objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具 objdump 选项介绍 --archive-headers -a 显示档案库的成员信息,类似ls -l ...

  3. sed -i添加到第一行

    用sed的i\命令在第一行前面插入即可,加上 -i 选项直接操作文件. sed -i '1i\要添加的内容' yourfile 查看插入第一行是否成功 sed -n '1,1p' yourfile

  4. POJ 3663:Costume Party

    Costume Party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12607   Accepted: 4977 De ...

  5. windows driver 延时

    #define Delay_One_MicroSecond (-10) #define Delay_One_MilliSecond (Delay_One_MicroSecond * 1000) voi ...

  6. IBGP(内部BGP)的对等体组(命令解析)

    IBGP(内部BGP)对等体组配置解析: ①:创建对等体组. ②:定义对等体组策略,指定邻居路由器及所在的AS. ③:定义,更新源. ④:(若边界)定义自己下一跳. ⑤:加入对等体组. IBGP(内部 ...

  7. io流对数据的读写

    import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i ...

  8. CountDownLatch、CyclicBarrier、Semaphore的使用

    CountDownLatch(计数器) 主线程等待另外三个线程执行完成后再执行 public static void main(String[] args) { //定义一个CountDownLatc ...

  9. CTF-域渗透--HTTP服务--命令注入1

    开门见山 1. 扫描靶机ip,发现PCS 192.168.31.210 2. 用nmap扫描开放服务和服务版本 3. 再扫描全部信息 4. 探测http服务的目录信息 5. 再用dirb扫描 6. 查 ...

  10. 正则表达式模式修正符 比如/esi

    正则表达式模式修正符 比如/esi 作者: 字体:[增加 减小] 类型:转载 下面列出了当前在 PCRE 中可能使用的修正符.括号中是这些修正符的内部 PCRE 名.修正符中的空格和换行被忽略,其它字 ...