C 整洁的麻将桌 SRM 07
背景&&描述
天才麻将少女KPM立志要在日麻界闯出一番名堂。
KPM上周双打了n场麻将,但她这次没控分,而且因为是全民参与的麻将大赛,所以她的名次范围是1..10^9。
因为找膜法使的事被妹子打断了三条腿后,KPM这次要用自己的真实本领让名次严格递增。
幸好她从前把出题人的头像卖给了炮姐,现在KPM可以入侵比赛系统,修改自己的排名。
KPM毕竟是新手,每次操作只能使自己某场比赛的排名增加或者减少1。
她急着去见妹子,你需要帮她算出最少需要多少次操作。
因为妹子不打麻将,所以哪怕把名次改得<1或者>10^9都是没关系的。
输入格式
第一行一个整数n。
第二行n个整数,表示n场的排名。
输出格式
一个整数,表示最小操作数。
样例输入
5 233 2333 2332 2333 2333
样例输出
3
数据范围与约定
- 对于100%的数据:
这道题据说是套路题 将每个点减去他的位置 然后问题就转换成了求一个不下降序列
然而我连不下降序列都不会 还得去学 唉 惨啊 蒟蒻就是蒟蒻
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define LL long long using namespace std; const int M=1e5+7; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int n,w[M],v[M],ans[M]; int main() { n=read(); for(int i=1;i<=n;i++) w[i]=read()-i,v[i]=w[i]; sort(v+1,v+1+n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ ans[j]+=abs(w[i]-v[j]); if(j>1) ans[j]=min(ans[j],ans[j-1]); } printf("%d ",ans[n]); return 0; }