NC216209. PassThroughWithOneBreath
描述
输入描述
第一行给出一个正整数,表示共有T组测试数据。
对于每组测试数据第一行给出一个正整数 个整数输入保证所有的总和小于等于。
第二行按顺时针给出个数字,第个数字表示第张牌的牌面,第张牌和第张牌相连,第张牌的牌面值。
输出描述
输出包含行,每行包含一个整数,表示将第组牌变成一气通贯牌所需要的最少操作次数。
示例1
输入:
2 3 2 3 3 5 5 3 1 4 6
输出:
1 5
说明:
样例中第一组最少操作次数达到的一种牌面是2 3 4,共需次。C++(clang++11) 解法, 执行用时: 30ms, 内存消耗: 376K, 提交时间: 2020-12-28 16:25:50
#include<bits/stdc++.h> using namespace std; long long a[10000],b[10000],ans; int main(void){ long long j,sum,y,i,t,n,x; scanf("%lld",&t); while(t--){ sum=1e16; scanf("%lld",&n); for(i=1;i<=n;i++){ scanf("%lld",&a[i]); a[i+n]=a[i]; } for(i=1;i<2*n;i++){ y=a[i]-i; for(j=1;j<2*n;j++){ b[j]=b[j-1]+abs(a[j]-y-j); if(j>=n) sum=min(sum,b[j]-b[j-n]); } } printf("%lld\n",sum); } }