博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF724B. Batch Sort[枚举]
阅读量:5080 次
发布时间:2019-06-12

本文共 2479 字,大约阅读时间需要 8 分钟。

B. Batch Sort
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given a table consisting of n rows and m columns.

Numbers in each row form a permutation of integers from 1 to m.

You are allowed to pick two elements in one row and swap them, but no more than once for each row. Also, no more than once you are allowed to pick two columns and swap them. Thus, you are allowed to perform from 0 to n + 1 actions in total. Operations can be performed in any order.

You have to check whether it's possible to obtain the identity permutation 1, 2, ..., m in each row. In other words, check if one can perform some of the operation following the given rules and make each row sorted in increasing order.

Input

The first line of the input contains two integers n and m (1 ≤ n, m ≤ 20) — the number of rows and the number of columns in the given table.

Each of next n lines contains m integers — elements of the table. It's guaranteed that numbers in each line form a permutation of integers from 1 to m.

Output

If there is a way to obtain the identity permutation in each row by following the given rules, print "YES" (without quotes) in the only line of the output. Otherwise, print "NO" (without quotes).

Examples
input
2 4 1 3 2 4 1 3 4 2
output
YES
input
4 4 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3
output
NO
input
3 6 2 1 3 4 5 6 1 2 4 3 5 6 1 2 3 4 6 5
output
YES

貌似交换行后再交换两个列不会得到更优解 爆枚交换哪两列然后每行贪心
#include 
#include
#include
#include
#include
using namespace std;const int N=25,INF=1e9+5;inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){
if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f;}int n,m,a[N][N];bool check(){ for(int i=1;i<=n;i++){ int cnt=0; for(int j=1;j<=m;j++) if(a[i][j]!=j) cnt++; if(cnt>2) return false; } return true;}int main(){ n=read();m=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=read(); if(check()) {puts("YES");return 0;} for(int i=1;i<=m;i++) for(int j=i+1;j<=m;j++){ for(int z=1;z<=n;z++) swap(a[z][i],a[z][j]); if(check()) {puts("YES");return 0;} for(int z=1;z<=n;z++) swap(a[z][i],a[z][j]); } puts("NO");}

 

 

转载于:https://www.cnblogs.com/candy99/p/6058850.html

你可能感兴趣的文章
DIV和SPAN的区别
查看>>
第一次使用cnblogs
查看>>
C#语法糖之 session操作类 asp.net
查看>>
2015 Multi-University Training Contest 3
查看>>
使用Gitblit 在windows 上部署你的Git Server
查看>>
217. Contains Duplicate
查看>>
vue2.0 关于Vue实例的生命周期
查看>>
jenkins 更换主数据目录
查看>>
Silverlight中恼人的g.i.cs错误
查看>>
SQLite 数据库增删改查
查看>>
<s:iterator>的status
查看>>
C++入门--1.0输入输出
查看>>
让搭建在Github Pages上的Hexo博客可以被Google搜索到
查看>>
Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段...
查看>>
在WPF控件上添加Windows窗口式调整大小行为
查看>>
背水一战 Windows 10 (36) - 控件(弹出类): ToolTip, Popup, PopupMenu
查看>>
HDU2665_Kth number
查看>>
持续集成 Jenkins +Gitlab + SSH 自动发布 HTML 代码
查看>>
二维数组中某列的求和
查看>>
BOM问题
查看>>