菜鸡一只,大佬勿喷(⊙﹏⊙)。
对象存储调度问题
思路:利用优先队列使其从大到小将空间进行排序,优先判断让容量最大的空间进行装填,装填对象也从占用内存最高的开始进行。
#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;
}