2021CCPC华为云挑战赛
hdu 7087 对象存储调度问题
分析:
-
关键在于对 A i A_i Ai 解释的一句话:“保证 A i A_i Ai 为 2 2 2 的整数次幂”
这样的话,就不存在那种复杂的情况了(由多个小的构成一个新的大数,比直接将大数放入最大分条中更优,例如:数据大小分别为: 8 , 7 , 6 , 1 8,7,6,1 8,7,6,1 ;分条大小为: 13 , 9 13,9 13,9 ;… 这样的话, 8 8 8 就不能给 13 13 13 )
为什么不会存在那种复杂的情况:对于当前的大数来说,是剩余小数的组成部分,剩下的小数若组成一个比当前最大数还要大的,所组成的数的一部分便可以由当前最大数替换掉,因此不存在这种复杂的情况
举个栗子:当前数为 8 8 8 ,比 8 8 8 小的数 1 , 2 , 4 1,2,4 1,2,4 最大只能组成 7 7 7 ,组不了比 8 8 8 大的数(若两个 4 4 4 就相当于 8 8 8 了,可被替换),因此当前最大的放入最大分条中,若不能直接输出 " N o " "No" "No"
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
priority_queue <int> q;
int a[N];
signed main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T;
cin>>T;
while(T--)
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++)
{
int w;
cin>>w; q.push(w);
}
sort(a+1,a+1+n);
int fg=1;
for(int i=n;i>=1;i--)
{
int mx=q.top();
q.pop();
if(mx < a[i])
{
cout<<"No"<<endl;
fg=0; break;
}
mx -= a[i];
q.push(mx);
}
if(fg) cout<<"Yes"<<endl;
while(!q.empty()) q.pop();
}
return 0;
}