3 条题解
-
0
设 表示第 i 只猴子分到的金子克数
------(1)
------(2)
------(3)
------(4)
……
------(n-2)
------(n-1)
------(n)
相减,相加,消项,注意 n 是奇数
(1)-(2)=
(3)-(4)=
……
(n-2)-(n-1)=
------(n)
以上式子相加,得:
所以
#include<bits/stdc++.h> using namespace std; long long n,a[1000005],f[1000005]; int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { if(i%2) { f[1]+=a[i]; } else { f[1]-=a[i]; } } for(int i=2;i<=n;i++) f[i]=2*a[i-1]-f[i-1]; for(int i=1;i<=n;i++) cout<<f[i]<<' '; return 0; } -
-1
题意
给你一个环 他的编号分别为
他们直接有一个篮子,与之间的篮子编号为,特别的和之间的篮子编号为
每个点会把他自己的点权分成等大的两份分别放在左右两个篮子中,给出每个篮子的值
问每个点的点权是多少
做法
设为点的点权
然后可以发现
code
#include <bits/stdc++.h> using namespace std; const long long N = 1e6 + 10; long long n, s[N], sum; void read() { cin >> n; sum = 0; for(long long i = 1; i <= n; i++) { cin >> s[i]; sum += s[i]; } return ; } void compute() { long long www = 0; for(long long i = 1; i <= n; i++) { if(i % 2 == 1) www += s[i]; else www -= s[i]; } long long k = www; for(long long i = 1; i <= n; i++) { if(k < 0) { cout << -1 << '\n'; return ; } k = - k + 2 * s[i]; } if(k < 0) { cout << -1 << '\n'; return ; } k = www; for(long long i = 1; i <= n; i++) { cout << k << ' '; k = - k + 2 * s[i]; } cout << '\n'; } int main() { // freopen("国王游戏ex.in","r",stdin); // freopen("国王游戏ex.out","w",stdout); ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); while(1) { read(); if(n == 0) break; compute(); } return 0; }
- 1
信息
- ID
- 71
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 41
- 已通过
- 14
- 上传者