• 洛谷 P3462 [POI2007]ODW-Weights(贪心)


    传送门


    解题思路

    注意所有的砝码都是倍数关系,所以砝码质量的种类数只有log级别。
    先用类似进制的方式求出质量尽可能多的装砝码方案。
    然后再在其基础上进行贪心调整——砝码质量小的尽可能多用。
    所以从小到大进行贪心选择即可(仿照减法借位)

    AC代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn=1e5+5;
    int n,m,w[maxn],a[maxn],num[50],ans,mm,b[maxn],cnt[maxn];
    int main(){
    	ios::sync_with_stdio(false);
    	cin>>n>>m;
    	for(int i=1;i<=n;i++) cin>>w[i];
    	for(int i=1;i<=m;i++) cin>>a[i],b[i]=a[i];
    	sort(a+1,a+m+1);
    	mm=unique(a+1,a+m+1)-a-1;
    	for(int i=1;i<=m;i++) num[lower_bound(a+1,a+mm+1,b[i])-a]++;
    	for(int i=1;i<=n;i++){
    		for(int j=mm;j>=1;j--){
    			if(!w[i]) break;
    			int res=w[i]/a[j];
    			res=min(res,num[j]);
    			w[i]-=res*a[j];
    			num[j]-=res;
    			cnt[j]+=res;
    		}
    	}
    	for(int i=1;i<=mm;i++){
    		for(int j=i+1;j<=mm;j++){
    			if(!num[i]) break;
    			int res=min(cnt[j],(int)ceil(1.0*num[i]*a[i]/a[j]));
    			cnt[j]-=res;
    			cnt[i]+=min(num[i],res*a[j]/a[i]); 
    			num[i]-=min(num[i],res*a[j]/a[i]);
    		}
    		ans+=cnt[i];
    	}
    	cout<<ans;
    	return 0;
    }
    
  • 相关阅读:
    hud 1397
    hdu 1211
    hdu 1124
    hdu 1104
    1788
    hdu 1796
    sdut 2169
    hdu 1019
    $http post 取不到数据
    sql
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/15378974.html
Copyright © 2020-2023  润新知