列表

详情


NC256766. 游游的k-好数组

描述

游游定义一个数组为k-好数组,当且仅当它的所有长度为k的区间和相等。例如,数组[1,2,2,1]为3-好数组,因为两个长度为3的区间和都是5。
游游拿到了一个大小为n的数组,每次操作可以选择一个元素加1。游游最多可以进行x次操作,她希望不超过x次操作后,数组变为k-好数组,且数组的最大值尽可能大。你可以帮游游求出这个最大值吗?

输入描述

t组询问。
每组询问输入两行,第一行输入三个正整数n,k,x。第二行输入n个正整数a_i,用空格隔开。
1\leq t \leq 1000
1\leq k\leq n \leq 10^5
1\leq a_i ,x \leq 10^9
所有询问的n之和保证不超过10^5

输出描述

对于每组询问,输出一行答案。
如果无法用不超过x次操作使得数组变成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,不是最优)
第二组询问,操作4次使得数组变为[3,4,3,4]即可。
第三组询问,显然无法操作1次使得数组变成3-好数组。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

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)

上一题