crazy rows
1,下三角矩阵我佛了。。
2,给定一个0和1组成的矩阵。只允许交换相邻两行,最少需要多少次交换,能得到一个
下三角矩阵。
3,什么是下三角矩阵?
主对角线上方的全是0就是下三角矩阵。
4,最开始想的肯定是暴力。。所有的n!种交换方案。
但是暴力肯定过不了大数据的。
5,当我们看不怎么懂文字解释时,
去找网上容易懂的文字解释。
大概知道是用贪心的。。但是具体还是不咋懂。
那就直接上代码。来代码模拟。
我终于模拟了一遍并且大致懂啥意思了。
6,
#include<iostream>
#include<algorithm>
using namespace std;
int n,m[1005][1005],a[1005];
int main(){
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>m[i][j];
int res=0;
for(int i=0;i<n;i++)
{
a[i]=-1;
for(int j=0;j<n;j++)
{
if(m[i][j]==1) a[i]=j;
}
}
//这一部分是用来存矩阵的。只存每行最后一个1就行。
//但我看了实际上就是个遍历
for(int i=0;i<n;i++)
{
int pos=-1;
for(int j=i;j<n;j++)
{
if(a[j]<=i)
{
pos=j;
break;
}
//看哪一行能够满足换到第一行的条件。
//这块还是用了一点这个什么下三角矩阵的性质的。
}
for(int j=pos;j>i;j--)
{
swap(a[j],a[j-1]);
res++;
}
}
//这个东西嘛,就是用来确定要移动到第i行的是pos行。
cout<<res<<endl;
}
7,继续把。
8,我起码每次看见个题得思考个10来分钟吧。。。
9,费大和费小,
费大,就是给你一个一定可以变成下三角矩阵的矩阵,问你最少需要几步这个矩阵可以变成下三角矩阵。(只能相邻行交换)
要注意a[i]这个数组用的很不错。直接很是简化了问题。(每行交换的东西)
但是这个思维转化嘛。。我先确定第一行,再确定第二行,再确定第三行。。人家说是贪心。。我嘛。就那样吧。
你懂个锤子。
费小吧。
#include<iostream> #include<algorithm> using namespace std; int n,m[1005][1005],a[1005],res=0; int main(){ cin>>n; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>m[i][j]; for(int i=0;i<n;i++) { a[i]=-5; for(int j=0;j<n;j++) if(m[i][j]==1) a[i]=j; } for(int i=0;i<n;i++) { int pos=-5; for(int j=i;j<n;j++) { if(a[j]<=i) { pos=j; break; } } for(int j=pos;j>i;j--) { swap(a[j],a[j--]); res+=1; } } cout<<res<<endl; }
反正我改了。。