目录
原题描述:
题目描述
时间:1s 空间:256M
题目描述:
输入格式:
输出格式:
样例1输入:
样例1输出:
样例2输入:
样例2输出:
约定:
作者hack数据:
输入:
输出:
主要思路:
求答案:
代码code:
原题描述:
时间限制: 1000ms
空间限制: 262144kB
题目描述
时间:1s 空间:256M
题目描述:
小信有一个长度为 的数组 ,他想把这个数组变成回文数组。
他可以操作若干次,每次操作,选择一个区间,把 都加 。
小信想知道最少需要操作多少次,才能把这个数组变成回文数组。
输入格式:
第一行包含一个整数 。
第二行包含长度为 的数组 。
输出格式:
输出一个整数表示答案。
样例1输入:
6
2 6 4 3 4 1
样例1输出:
2
样例2输入:
3
1 10 1
样例2输出:
0
约定:
对于100%的数据,,
对于样例1:选择 和 ,数组变成 。
作者hack数据:
输入:
100
295117793 852883521 36092583 681745569 23541647 32480206 769047426 128111255 850655575 8867194 368297902 613812293 347992953 134986353 863972512 970426966 785192811 540559474 988288563 456754809 154127192 76979571 460304832 733713409 70970660 635551742 769915887 7641407 660822912 748447793 598826955 609365172 822558626 849292246 849242098 941529514 216622499 647819205 34288562 360796801 564768544 688079849 702507270 777507089 776688905 515137821 52246637 307838702 453802754 136279521 618645584 803000735 877721915 194107657 136422627 187654402 227004447 519370751 457822037 804058036 911179942 457248799 305969878 787934175 14313040 9582663 34547015 870503865 216036366 15134170 174645568 77155278 213349935 622731147 84032183 14391789 46136215 862980910 139514947 73594405 599740219 178453695 493364413 239940662 981248295 136272953 532638230 679826619 820419790 652179351 81724392 185039813 238018126 660954049 903887251 617400394 816543430 957422974 272333302 464554507
输出:
12198773018
主要思路:
这个是个贪心题目,看了我的hack数据,我们也要知道,这题要开:long long!!!
我们可以这样想,因为只加不减,所以可以从原数组中,相对的两个(a[i]相对a[n-i+1])
如果a[i]大,那么a[i]就不需要被加,sum[i] = 0,a[n-i+1]就要被加a[i]-a[n-i+1]次,sum[n-i+1] = a[i]-a[n-i+1]
反之亦然。
sum[i]就代表了这个数字要加几次才可以和他相对的数字相等。
求答案:
上面的这些话是初始化,现在我们要求答案,我们可以找一找规律。
用样例1来说。
sum数组={0,0,0,1,2,1}
我们不看0。
看后边的1,2,1。
如何可以发现规律?
如果只有1,那么最少操作一次。
如果只有1,2,那么最少操作两次。
如果只有1,2,1还是操作两次。
有些同学会很快发现规律:最少操作数就是sum连续一段区间的最大值。
那么我告诉你:恭喜你,猜错了。
sum反例:1,2,1,3。
这个时候,答案应该是4,而按上面的方式,答案是3。
所以正确结论是:
如果sum[i]>sum[i-1],那么ans+=sum[i]-sum[i-1]
如果sum[i]<sum[i-1],那么答案不变。
代码code:
理解上面的话后,就好写了。
#include<bits/stdc++.h>
using namespace std;
int n;
int a[300010];
int sum[300010];
int main()
{
cin>>n;
//输入
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
// int ret=0;
//初始化
for(int i=1,j=n;i<=n,j>=1;i++,j--)
{
if(a[i]>=a[j])
{
sum[i] = 0;
sum[j] = a[i]-a[j];
}
else
{
sum[i] = a[j]-a[i];
sum[j] = 0;
}
// cout<<sum[i];
}
//算答案
long long ret=0;
for(int i=1;i<=n;i++)
{
if(sum[i]>=sum[i-1])
{
ret+=sum[i]-sum[i-1];
}
}
cout<<ret;
return 0;
}