在军队中
军官命令新兵排行成列。新兵们排成了K行,每行有N人。但有K人没有排在正确的位置上。
正确的排队位置如下:第一个士兵必须是最高的,第二个是第二高的,依此类推,最后一个士兵必须是最矮的。为了排好队,军官规定每一个士兵,如果与他同一排的前一个人比他矮,那么他就向前跳一步。
注意没有两个新兵的身高相同。
军官想找出哪一排士兵跳的总次数最多,好惩罚他们到厨房去工作。你的目标就是帮助军官找到这一排。
Input
输入的第一行包含了两个数N和K(2≤N≤10000,1≤K≤20)。接下来的K行每行包含N个整数。新兵已经按照身高编好了号(1号最高,N号最矮)。每一行是相应的一排,例如某一行的第一个整数代表这行的第一个人等等。
Output
输出跳跃次数最多的那一行的编号。如果有几行次数相同,则输出行编号最小的那个。
Sample Input
3 3
1 2 3
2 1 3
3 2 1
Sample Output
3
【参考程序】:
#include<iostream>
using namespace std;
int c[10001];
int k,n;
int lowbit(int x)
{
return x^(x & (x-1));
}
int getsum(int x)
{
int sum=0;
while (x)
{
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
void modify(int x)
{
while (x<=n)
{
c[x]++;
x+=lowbit(x);
}
}
int main()
{
scanf("%d%d",&n,&k);
int d,ans,kk,s;
ans=-1;
for (int i=1;i<=k;i++)
{
memset(c,0,sizeof(c));
s=0;
for (int j=1;j<=n;j++)
{
scanf("%d",&d);
int tt=getsum(d);
s+=(d-1)-tt;
modify(d);
}
if (ans<s)
{
ans=s;
kk=i;
}
}
printf("%d\n",kk);
return 0;
}