NC256766. 游游的k-好数组
描述
输入描述
有组询问。
每组询问输入两行,第一行输入三个正整数。第二行输入个正整数,用空格隔开。
所有询问的之和保证不超过
输出描述
对于每组询问,输出一行答案。
如果无法用不超过次操作使得数组变成k-好数组,请输出-1。
否则输出一个正整数,代表操作后数组的最大值。
示例1
输入:
3 4 3 1 1 2 1 1 4 2 5 1 2 3 4 5 3 1 1 100 1 1 1
输出:
3 4 -1
说明:
第一组询问,操作一次使得数组变为[1,3,1,1]即可。(请注意,虽然可以变成[1,2,2,1],但这样最大值是2,不是最优)C++(g++ 7.5.0) 解法, 执行用时: 38ms, 内存消耗: 508K, 提交时间: 2023-08-06 19:20:06
#include "bits/stdc++.h" using namespace std; void solve() { int n, k, x; cin >> n >> k >> x; vector<int> a(n); vector<int> mx(k); for(int i = 0; i < n; i++) { cin >> a[i]; mx[i % k] = max(mx[i % k], a[i]); } for(int i = 0; i < n; i++) { x -= mx[i % k] - a[i]; } if(x < 0) { puts("-1"); return; } int ans = 0; int d = n / k, m = n % k; for(int i = 0; i < k; i++) { int nm = d + (i < m); ans = max(ans, mx[i] + x / nm); } cout << ans << endl; } int main() { int t; cin >> t; while(t--) { solve(); } }
C++(clang++ 11.0.1) 解法, 执行用时: 33ms, 内存消耗: 396K, 提交时间: 2023-08-09 11:22:51
#include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n,k,x; cin>>n>>k>>x; int a[n],t[n]; memset(t,0,sizeof(t)); for(int i=0;i<n;i++) { cin>>a[i]; t[i%k]=max(t[i%k],a[i]); } int cn=0; for(int i=0;i<n;i++) { cn+=t[i%k]-a[i]; } if(x<cn) cout<<-1<<endl; else { x-=cn; int ans=0; for(int i=0;i<k;i++) { int rest=n/k+(i<n%k); ans=max(ans,t[i]+x/rest); } cout<<ans<<endl; } } return 0; }
Python3 解法, 执行用时: 317ms, 内存消耗: 7208K, 提交时间: 2023-08-07 13:34:55
t = int(input()) for _ in range(t): n, k, x = map(int, input().split()) a = list(map(int, input().split())) b = [[a[j] for j in range(i, n, k)] for i in range(k)] res = sum(map(lambda a: len(a) * max(a) - sum(a), b)) if res > x: print(-1) else: x, res = x - res, 0 for a in b: res = max(res, x // len(a) + max(a)) print(res)
pypy3 解法, 执行用时: 338ms, 内存消耗: 27424K, 提交时间: 2023-08-07 19:28:35
for _ in range(int(input())): n, k, x = map(int, input().split()) a = list(map(int, input().split())) judge = [[a[j] for j in range(i, n, k)] for i in range(k)] x -= sum(map(lambda nums: len(nums) * max(nums) - sum(nums), judge)) print(max((max(nums) + x // len(nums)) for nums in judge) if x >= 0 else -1)