在军队中军官命令新兵排行成列。新兵们排成了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<stdio.h>
#include<stdlib.h>
#include<string.h>
long c[10001];
long n,k;
long lowbit(long x)
{
return x^(x&(x-1));
}
void modify(long x)
{
while (x<=n)
{
c[x]++;
x+=lowbit(x);
}
}
long getsum(long x)
{
long s=0;
while (x)
{
s+=c[x];
x-=lowbit(x);
}
return s;
}
int main()
{
scanf("%d%d",&n,&k);
long ans,sum,d,tt,kk;
ans=-1;
for (int i=1;i<=k;i++)
{
sum=0;
memset(c,0,sizeof(c));
for (int x=1;x<=n;x++)
{
scanf("%d",&d);
tt=getsum(d);
sum+=(d-1)-tt;
modify(d);
}
if (sum>ans)
{
ans=sum;
kk=i;
}
}
printf("%d\n",kk);
return 0;
}