这道题本质上是模拟题,先看题
先捋一下思路,什么条件下为一致奶牛,什么条件下为不一致奶牛?
这个很容易想到,如果相对排名位置一直不变的就为一致奶牛,换句话说就是如果存在两次排名中某两头奶牛的相对排名有变化,那么这一对就不可能是一致奶牛;
到这里就很简单了,我们只需要统计一对奶牛是否存在相对位置变化即可,我们用二维数组g[N][N]来存储每对奶牛的关系,当g[i][j]为0时,说明编号为i、j的两头奶牛的关系未确认,当其为1时说明这两头奶牛为一致奶牛,当其为-1时说明为不一致奶牛;
那么关系判读决策如下;
得到i、j的相对位置信息,不妨设i排名大于j;
1:判断g[j][i]是否为1;
(1)成立:那么说明顺序变了,讲g[i][j]和g[j][i]设置为-1
(2)不成立:跳过
2:判断g[i][j]是否为-1
(1)成立:说明不可能为一致奶牛
(2)不成立:说明到目前为止可以为一致奶牛,将g[i][j]设置为1
那么接下来就是代码阶段了
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=100;
int g[N][N];//ij为i>j排名是否成立
int n,m;
int main(){
cin>>m>>n;
while(m--){
vector<int> mid;
for(int i=0;i<n;i++){
int x; cin>>x;
mid.push_back(x);
}
//cout<<mid.size()<<endl;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
int x=mid[i],y=mid[j];
if(g[y][x]==1){
g[y][x]=-1,g[x][y]=-1;
}
if(g[x][y]!=-1){
g[x][y]=1;
}
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(g[i][j]==1||g[j][i]==1) ans++;
}
}
cout<<ans;
}