SDUT 2022 Spring Team Contest——9(补题)
Problem D: Down the Pyramid
Down the Pyramid - Gym 102021D - Virtual Judge (vjudge.net)
概述:给你一个序列,根据这个序列,写出它下一层金字塔的可能出现的序列数目。
核心:一个点确定之后能推出另一个点的准确值。如果我们确定了下一层金字塔左端第一个数,那么后面所有数都能够得到一个确定值。
int n; cin >> n; for(int i=0;i<n;i++) cin >> q[i]; for(int i=1;i<=n;i++) a[i]=q[i-1]-a[i-1]; for(int i=0;i<=n;i++)cout << a[i] << " ";
//样例(1)展示:
// 12 5 7 7 8 4
// 0 12 -7 14 -7 15 -11
由题意值a数组是非负整数,此时的题目就变成了求:如何将a数组转化成全部是非负整数并计算出数量
通过观察我们发现:
奇数项的a[i]变化是递增
偶数项的a[i]变化是递减
所以我们只需要关心递减的项里面的最小值就可以
PS:if(min(a[i])=2) ans=3 (2,1,0)三种情况
如果怎么调整都会存在负数
说明情况为0
代码如下:
#include <bits/stdc++.h> #define endl '\n' #define x first #define y second #define int long long #define SugarT ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); using namespace std; const int N=1e6+10; const int INF=0x3f3f3f3f; const int mod=1e9+7; const double eps = 1e-6; int q[N],a[N]; void solve() { int n; cin >> n; for(int i=0;i<n;i++) cin >> q[i]; for(int i=1;i<=n;i++) a[i]=q[i-1]-a[i-1]; for(int i=0;i<=n;i++)cout << a[i] << " "; int k=1; for(int i=0;i<=n;i++) k=min(k,a[i]); for(int i=0;i<=n;i++) { if(i%2==0) a[i]-=k; else a[i]+=k; } //for(int i=0;i<=n;i++)cout << a[i] << " "; int ans=1e18; for(int i=0;i<=n;i++) { if(i%2==1) ans=min(ans,a[i]); } if(ans<0)ans=-1; cout << ++ans << endl; } signed main() { SugarT int T=1; //cin >> T; while(T--) solve(); return 0; }