题解:P13257 [GCJ 2014 #2] Up and Down
Dustlpes_CZY · · 题解
题目大意
给你
思路
刚开始看到黄题以为需要找到关键字
我们可以从先升后降这一点出发,如果
以样例
- 最小值 =
A_1 =1 ,此时已经处于序列的头,交换次数为0 。 - 最小值 =
A_4 =3 ,此时处于a_2 到a_{n-1} 中,则我们要让它交换到A_1 orA_n ,此时到A_n 比到A_1 移动距离短,所以交换到A_n 交换次数为1 。 - 最小值 =
A_4 =7 ,满足“先升后降”条件,交换次数为0 ,此时序列A 为[1,8,10,7,3] 满足“先升后降”所以之后交换次数全为0 ,答案为1 ,正确。
理论存在,实践开始!
AC CODE
(相必诸位最想看这个吧,我也是 )
#include <bits/stdc++.h>
#define LL long long
#define lop(x,l,r,c)\
for(LL x=l;((r)-(x))*(c)>=0;x+=(c))
#define the return
using namespace std;
const LL N=1919810;
LL ans,a[N],n,T;
void solve(LL ansi){ ans=0;
cin>>n;
lop(i,1,n,1) cin>>a[i];
while(n){
LL mi=1234567891,mini=114514;
//温知识: 1234567891 是质数
lop(i,1,n,1) if(a[i] < mi){
mi=a[i]; mini=i;//找出最小值并记录
}
ans+=min(mini-1,n-mini);//两边取最近
// mini-1 是1--mini移动距离,n-mini 是到 n 的距离
lop(j,mini,n-1,1) swap(a[j],a[j+1]);
n--;//删除 mini ,mini 已经用不到了
}
printf("Case #%lld: %lld\n",ansi,ans);
the ;
}
int main(void){ cin.tie(0)->sync_with_stdio(0);//美妙的 ios
cin>>T;
lop(i,1,T,1) solve(i);
the 0;
}
最后
这是本人的第一篇题解!!!赏个赞再走吧!(管理员大大辛苦了!)
修改:2026 年 1 月 28 日,修改代码以及标题。