题意:第一个数组全为奇数,第二个数组全为偶数,要求有第一个数组构成的数怎么移动最小次数后小于第二个数组构成的数。
题解:因为每一个数都不相等,那么就转换成求两个数组第一个数的大小,我们将第一个数组中的每一个数移动到第一个位置上的次数存到比自己大的第二个数组的数a数组中(有点树状数组的意思),如果数组有数了,那就break掉,因为我们要找的就是第一个小于的数,然后遍历a数组,将其到第一个位置的次数加在a数组中,找到最小的就是答案。
- #include <bits/stdc++.h>
- using namespace std;
- const int N=200005;
- int a[N];
- int main()
- {
- int t,n,x,ans;
- scanf("%d",&t);
- while(t--)
- {
- memset(a,0,sizeof a);
- ans=0x3f3f3f3f;
- scanf("%d",&n);
- for(int i=1; i<=n; i++)
- {
- scanf("%d",&x);
- for(int j=x+1; !a[j]&&j<=2*n; j+=2)
- {
- if(a[j])break;
- a[j]+=i;
- }
- }
- for(int i=0; i<n; i++)
- {
- scanf("%d",&x);
- a[x]+=i;
- ans=min(ans,a[x]-1);
- }
- //for(int i=2; i<=2*n; i+=2)cout<<a[i]<<" ";
- printf("%d\n",ans);
- }
- }