题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=6227
题目大意:
一些坑;
有的坑里面有兔子,有的没有;
坑按顺序排着;
边上的兔子两个兔子可以调到中间有坑的两个兔子之间;
问最多跳多少次;
结束状态是这些兔子之间没有坑了;
思路:
一开始,边上间隔小的那个兔子跳到里面,并且贴到边上呵呵呵呵;
然后每次都这样做;
答案为sigma(距离和)- 最开始边上小的距离;
上码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int T,t,i,l,r,jg,n,x,tiao,wz,ans,prel,prer,l2,r2,jg1,jg2,now,pre,maxjg,temp;
int a[100005];
int main()
{
scanf("%d",&T);
for (t=1; t<=T; t++)
{
scanf("%d",&n);
ans=0;
memset(a,0,sizeof(a));
for (i=1; i<=n; i++){
scanf("%d",&x);
a[x]=1;
}
prel=1; prer=10005;
l=prel; r=prer;
for (;;) { if (a[l]!=0) break; l++; }
for (;;) { if (a[r]!=0) break; r--; }
l2=l,r2=r;
for (;;) { if (a[l2+1]==1) break; l2++; } l2++;
for (;;) { if (a[r2-1]==1) break; r2--; } r2--;
jg1=l2-l-1,jg2=r-r2-1;
if (jg1<jg2) temp=jg1; else temp=jg2;
//边上的特殊处理
prel=l; prer=r;
now=l,pre=l,maxjg=0;
for (;;)
{
if (now>=r) break;
for (;;){
now++;
if (a[now]==1) break;
}
ans+=now-pre-1;
pre=now;
}
//算出和然后准备减
cout<<ans-temp<<endl;
}
}
然后我发现我傻逼了;
直接排序不就行了,还搞个哈希自作多情;
可能被小数据范围误导了;