2021CCPC华为云挑战赛

本文探讨了2021年CCPC华为云挑战赛中对象存储调度问题的业务模型,通过优先队列策略和暴力模拟方法,对比了两种不同的解决方案。作者分享了使用优先级排序和容量分配的思路,并介绍了与大佬交流中采用的单调函数技巧。
摘要由CSDN通过智能技术生成

菜鸡一只,大佬勿喷(⊙﹏⊙)。

对象存储调度问题

思路:利用优先队列使其从大到小将空间进行排序,优先判断让容量最大的空间进行装填,装填对象也从占用内存最高的开始进行。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll t,n,m,a[N],b[N],sum1,sum2,flag;
priority_queue<ll,vector<ll>,less<ll> > q;
bool cmp(ll x,ll y){return x>y;}
int main()
{
	cin>>t;
	while(t--)
	{
		sum1=sum2=flag=0;
		cin>>n>>m;
		for(int i=1;i<=n;i++)cin>>a[i],sum1+=a[i];
		while(!q.empty())q.pop();//注意情况队列
		for(int i=1;i<=m;i++)cin>>b[i],sum2+=b[i],q.push(b[i]);
		if(sum1>sum2){cout<<"No"<<endl;continue;}//物品大于空间必不可能
		sort(a+1,a+1+n,cmp);//物品从大到小排序
		for(int i=1;i<=n;i++)
		{
			ll temp=q.top();//取出最大空间
			if(temp<a[i])break;//最大空间都装不下则结束
			q.pop();
			q.push(temp-a[i]);//放入剩余空间
			if(i==n)flag=1;
		}
		if(flag)cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
} 

卷业务模型分析

结束以后和大佬交流了一下,大佬都是直接用kx+b的单调函数判断,我是fw呜呜呜~

思路:暴力模拟k求解

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll INF=1e12+10;
ll t,m,a1[N],a2[N],b[N],bs,flag,maxi,mini;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>m;
		for(int i=1;i<=m;i++)scanf("%lld",&a1[i]);
		for(int i=1;i<=m;i++)scanf("%lld",&a2[i]);
		for(int i=1;i<=m;i++)scanf("%lld",&b[i]);
		bs=b[1]/a1[1];//求k
		for(ll j=bs-300;j<=bs+300;j++)//小于300就WA了
		{
			ll bt=b[1]-j*a1[1];//求b
			maxi=0,mini=0;
			if(fabs(bt)>INF)continue;
			flag=1;
			for(int i=2;i<=m;i++)
			{
				ll tt=b[i]-(j*a1[i]+bt);
				if(tt<mini)mini=tt;
				if(tt>maxi)maxi=tt;
				if((maxi-mini)>20){flag=0;break;}//差值不对就推出
			}
			if(flag)break;
		}
		if(flag)cout<<"1"<<endl;
		else cout<<"2"<<endl;
	}
	return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值