Distance Gym - 102028I (思維)
阿新 • • 發佈:2018-12-16
題目連結:https://cn.vjudge.net/problem/Gym-102028I
具體思路:首先我們選定左邊界和右邊界.然後每一次按照左邊一個,第二次右邊一個的規律往上就可以了
具體原因:用筆在紙上畫畫就可以了,每一次放入一個點,他比原來額外再加的,除了上幾次的點和這個點之間的距離,還加上的是上一次加點的右邊界和左邊界,所以為了使加的最大,我們可以讓每一次的範圍儘可能的大,也就是按照左邊和右邊的趕著來就可以了.
#include<iostream> #include<cstring> #include<iomanip> #include<stdio.h> #include<cmath> using namespace std; # define inf 0x3f3f3f3f # define ll long long const int mod = 1e9 ; const int maxn = 100000+100; ll a[maxn]; int main() { int T; scanf("%d",&T); while(T--) { int n; ll sum=0; scanf("%d",&n); for(int i=1; i<n; i++) { scanf("%lld",&a[i]); sum+=a[i]; } ll tt=0,tmp=0; int l=1,r=n-1; for(int i=1; i<=n; i++) { if(i&1) { tmp+=tt; } else { tt+=sum; sum-=a[l]; l++; sum-=a[r]; r--; tmp+=tt; } if(i==1) printf("%lld",tmp); else printf(" %lld",tmp); } printf("\n"); } return 0; }