题目描述
小蓝有 n 个装了水的瓶子,从左到右摆放,第 i 个瓶子里装有 ai 单位的水。为了美观,小蓝将水循环染成了 k 种颜色,也就是说,第 i 个瓶子和第 i+k 个瓶子里的水的颜色相同。
小蓝发现有的瓶子里的水太少了,因此他规定如果第 i 个瓶子和第 j 个瓶子中的水颜色相同并且满足 i<j,即可将任意整数单位的水从第 i 个水瓶倒出,倒入第 j 个水瓶中。小蓝想知道任意次操作后所有瓶子中的水的最小值 min{ai} 最大可以是多少?
输入格式
输入的第一行包含两个正整数 n,k,用一个空格分隔。
第二行包含 n 个正整数 a1,a2,⋯,an,相邻整数之间使用一个空格分隔。
输出格式
输出一行包含一个整数表示答案。
输入输出样例
输入 #1复制
7 3 8 5 5 2 2 3 4
输出 #1复制
3
说明/提示
样例说明
其中一种方案:
- a1 往 a4 倒入 3 单位;
- a2 往 a5 倒入 2 单位;
- a3 往 a6 倒入 1 单位; 最终每个瓶子里的水:5,3,4,5,4,4,4,最小值为 3。
评测用例规模与约定
- 对于 40% 的评测用例,1≤n,ai≤100;
- 对于所有评测用例,1≤n,ai≤100000,1≤k≤n。
前天比赛的时候想错了,看对题目后写的那份正确率还不如看错题目写的那个;
我想成每次删去头了,但明显加上尾更对;
#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
#define F first
#define S second
#define pii pair<int,int>
using namespace std;
const int N=1e5+10;
void solve(){
int n,k,ans=N,sum,f;
cin>>n>>k;
int a[n];
for(int i=0;i<n;++i){
cin>>a[i];
}
for(int i=0;i<k;++i){
sum=a[i];//sum记总量
int cnt=1;//个数
ans=min(ans,a[i]);//防最小数在开头
for(int j=i+k;j<n;j+=k){
cnt++;
sum+=a[j];
if(a[j]<ans){
ans=min(ans,sum/cnt);
}
}
}
cout<<ans;
}
signed main() {
IOS
int t=1;
while(t--)solve();
return 0;
}
其实感觉还有点问题,但找不到样例