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;
}

反正我改了。。

posted @ 2020-02-03 14:12  北月真好  阅读(206)  评论(0编辑  收藏  举报