DTOJ#5221. 序列

传送门
给定一个长为 m m m 的序列 a a a

有一个长为 m m m 的序列 b b b,需满足 0 ≤ b i ≤ n 0\leq b_i \leq n 0bin ∑ i = 1 m a i b i ≤ D \sum_{i=1}^m a_ib_i \leq D i=1maibiD b i b_i bi 为整数。

∑ b i + k min ⁡ i = 1 m b i \sum b_i + k \min_{i=1}^m{b_i} bi+kmini=1mbi 的最大值。

第一行一个正整数 T T T,表示数据组数。

对于每组数据,第 1 1 1 行四个整数 n , m , k , D n, m, k, D n,m,k,D

2 2 2 m m m 个整数 a i a_i ai

对于每组数据,第一行一个整数 a n s ans ans

样例输入

2
5 3 2 13
1 2 3
6 3 4 24
2 3 3

样例输出

11
21

对于 15 % 15\% 15% 的数据, n , m ≤ 100 n, m \leq 100 n,m100

对于 30 % 30\% 30% 的数据, n ≤ 1 0 6 , m ≤ 100 n \leq 10^6,m \leq 100 n106,m100

对于另 30 % 30\% 30% 的数据, T = 1 T = 1 T=1 且数据随机。

对于 100 % 100\% 100% 的数据, T ≤ 5 , 1 ≤ n ≤ 1 0 9 , 1 ≤ k , m ≤ 2 × 1 0 5 , 1 ≤ D ≤ 1 0 18 , 1 ≤ a i ≤ 5000 T \leq 5,1 \leq n \leq 10^9,1\leq k, m \leq 2\times 10^5,1 \leq D \leq 10^{18},1\leq a_i \leq 5000 T5,1n109,1k,m2×105,1D1018,1ai5000

ahsdfz noip2020模拟

感性理解,即当 m i n min min 小的时候,增加时 k k k 的影响大,即单调增;当 m i n min min 大的时候,受到 n n n 的影响大,即单调减。
于是考虑三分。
不给大数据差评。就因为一个return 少了100分

#include<bits/stdc++.h>
#define N 200005
typedef long long ll;
using namespace std;
ll read(){
    
    
	ll op=1,sum=0;char ch=getchar();
	while(ch<'0'||ch>'9') {
    
    if(ch=='-') op=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+ch-'0',ch=getchar();
	return op*sum;
}
ll a[N],D,K,n,m,sum[N];
ll work(ll mid){
    
    
	ll pD=D,ans=0;
	ans+=K*mid+m*mid;
	pD-=mid*sum[m];
	if(pD<0)return -1;
	for(int i=1;i<=m;++i){
    
    
		if(pD<0)return ans;
		ll ned=pD/a[i];
		if(ned+mid>n)ned=n-mid;
		pD-=a[i]*ned;ans+=ned;
	}
	return ans;
}
int main(){
    
    
//	freopen("array.in","r",stdin);
//	freopen("array.out","w",stdout);
	int T=read();
	while(T--){
    
    
		n=read(),m=read(),K=read(),D=read();
		for(int i=1;i<=m;++i)a[i]=read();
		sort(a+1,a+1+m);
		for(int i=1;i<=m;++i)sum[i]=sum[i-1]+a[i];
		ll l=0,r=D/sum[m];
		while(l<r){
    
    
			//cout<<l<<" "<<r<<endl;
			//ll len=(2*l+r)/3;
			ll lmid=(2*l+r)/3,rmid=(2*r+l+2)/3;
			if(work(lmid)>=work(rmid))r=rmid-1;
			else l=lmid+1;
		}
	//	cout<<l<<" ";
		//cout<<work(0)<<endl;
	//	cout<<sum[m]*l<<endl;
		printf("%lld\n",work(l));
	}
	return 0;
}
/*
1
100 100 18 3324541
1337 3877 1598 3600 169 1639 3683 562 1365 1588 2077 4398 4130 4538 2465 4030 548 1411 985 1081 4691 2207 2111 1158 1142 3126 1912 252 2666 835 1992 2661 1100 3763 2954 169 3828 86 4016 2271 3464 2546 4948 1294 2049 3385 4621 2524 4970 559 1029 2407 4072 1122 2462 4415 4644 4613 829 1754 200 4848 2053 62 3466 290 930 1509 4081 1981 4132 4957 2255 3083 556 345 320 3293 1524 3765 3701 4142 2301 1634 2820 119 1777 843 1834 4561 156 649 1 3966 3908 4418 3193 2235 4236 23 

*/

猜你喜欢

转载自blog.csdn.net/CSDNzhanghongyu/article/details/110499193