[进制 贪心] BZOJ 1110 [POI2007]砝码Odw

来源:互联网 发布:域名的管理机构 编辑:程序博客网 时间:2024/06/05 11:25

因为都是倍数,可以考虑以最小的数为进制

然后从小到大装,不够的向高位借,类似小学减法,但感觉可卡?


#include<cstdio>#include<algorithm>#include<cstdlib>using namespace std;inline char nc(){static char buf[100000],*p1=buf,*p2=buf;if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }return *p1++;}inline void read(int &x){char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}const int N=100005;int n,m,tot;int a[N],b[N],c[N];int p[N];int ans;inline bool check(int k){    if(k>tot) return 0;    if(p[k]>0) return p[k]--,1;    if(check(k+1)) return p[k]=b[k+1]/b[k]-1,1;    return 0;}int main(){    read(n); read(m);    for(int i=1;i<=n;i++) read(a[i]);    for(int i=1;i<=m;i++) read(b[i]);    sort(b+1,b+m+1);    for(int i=1;i<=m;i++)        if(b[i]!=b[i-1])b[++tot]=b[i],c[tot]=1;        else c[tot]++;    for(int i=1;i<=n;i++)        for(int j=tot;j>=1;j--)            p[j]+=a[i]/b[j],a[i]%=b[j];    for(int i=1;i<=tot;i++)        while(c[i]!=0)        {            if(check(i))ans++,c[i]--;            else return printf("%d\n",ans),0;}    printf("%d\n",ans);    return 0;}


0 0
原创粉丝点击