社区讨论

T3求助

题目总版参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhj3qt8v
此快照首次捕获于
2025/11/03 20:14
4 个月前
此快照最后确认于
2025/11/03 20:14
4 个月前
查看原帖
拼尽全力无法战胜 orz orz
85pts,h=2 WA 了
CPP
#include <bits/stdc++.h>
using namespace std;
#define int __int128
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
inline void print(int n)
{
	if(n<0)
	{
		putchar('-');
		n*=-1;
	}
	if(n>9) print(n/10);
	putchar(n % 10 + '0');
}

#define db double
#define pii pair<int,int>
#define mp make_pair
int a[100006];
int n,m,k,h;
priority_queue<int> q;

bool check(int x)
{
	while(!q.empty())
	{
		q.pop();
	}
	int num1=0;
	int numh=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i]<x)
		{
			numh=numh+(x-a[i])/h;
			num1=num1+(x-a[i])%h;
			if((x-a[i])%h!=0)
			{
				q.push((x-a[i])%h);
			}		
		}
//		while(!q.empty())
//		{
//			cout<<q.top()<<" ";
//			q.pop();
//		}
	}
	if(numh<=k && num1<=m) return 1;
	if(numh<=k && num1>m)
	{

		while(numh<k && !q.empty() && num1>m) //really tang
		{
			int tmp=q.top();
			q.pop();
//			if(num1>m && numh+1<=k)
//			{
				num1-=tmp;
				numh+=1;
//			}
//			cout<<num1<<numh<<endl;
		}
		if(numh<=k && num1<=m) return 1;
	}
	return 0;
}
signed main()
{
    int st=clock();

//	freopen(".in","r",stdin);
//	freopen("sk.out","w",stdout);

	n=read(); m=read();k=read();h=read();

	int mn=INT_MAX;
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		mn=min(a[i],mn);
	}
	int l=mn,r=10000000000000008;
	int ans=mn;
	while(l<r)
	{
		int mid=(l+r)/2;
		if(check(mid))
		{
			ans=mid;
			l=mid+1;
		}
		else r=mid;

	}
	print(ans);
//	cerr<<1.0*(clock()-st)/CLOCKS_PER_SEC<<endl;
    return 0;
}
/*
1 0 2 2
1 
*/

回复

3 条回复,欢迎继续交流。

正在加载回复...