zoukankan      html  css  js  c++  java
  • Talent Show

    当然还是洛谷的题啦

    首先

    自己的思路:
    知识点:装满的01背包((f[0]=0),其他的赋值为(-inf))

    获得了70分的好成绩

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N = 20000005;
    const int inf=2147483646;
    int n,W,f[N],sum,ans;
    struct node{
    	int w,t;
    }a[N];
    inline int read()
    {
    	int ans=0,w=1;
    	char c=getchar();
    	while((c<'0'||c>'9')&&c!='-') c=getchar();
    	if(c=='-') { w=-1; c=getchar(); }
    	while(c>='0'&&c<='9')
    	{ ans=ans*10+c-'0'; c=getchar(); }
    	return ans*w;
    }
    int max(int x,int y)
    { if(x>y) return x; return y; }
    inline void print(int x)
    {
        if(x<0) putchar('-'),x=-x;
        if(x>9) print(x/10);
        putchar(x%10+'0');
    }
    int main()
    {
        register int i,j;
        n=read(); W=read();
    	for(i=1;i<=n;++i)
    	{
    		a[i].w=read(); a[i].t=read();
    		sum+=a[i].w; 
    	}
    	 for(i=0;i<=sum;++i)
    	  f[i]=-inf;
    	f[0]=0;
    	for(i=1;i<=n;++i)
    	 for(j=sum;j>=a[i].w;--j)
    	  f[j]=max(f[j],f[j-a[i].w]+a[i].t);
    	for(i=W;i<=sum;++i)
    	if(f[i]>0)
    	 ans=max(ans,f[i]*1000/i);
    	print(ans);
    	return 0;
    }
    

    很明显,(sum)会达到(1e9),当然会超时了,想了想也不会优化。
    于是开心地看了题解。

    然后

    定义(x[i]=0/1)表示选不选第i头牛。则要求最大的(ans),(ans=sigma(t[i]*x[i])/sigma(w[i]*x[i]))
    变形......题解的家

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define LL long long
    using namespace std;
    const int N = 10005;
    int n,W,w[300],t[300];
    LL f[N];
    bool check(int z)
    {
    	memset(f,128,sizeof(f));
    	f[0]=0;
    	LL tmp=f[W];
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=W;j>=0;j--)
    		if(f[j]!=tmp)
    		{
    			int jj=j+w[i];jj=min(jj,W);
    			f[jj]=max(f[jj],f[j]+t[i]-(LL)w[i]*z);
    		}
    	}
    	return f[W]>=0;
    }
    int twofen()
    {
    	int l=0,r=1000005,ans;
    	while(l<=r)
    	{
    		int mid=(l+r)>>1;
    		if(check(mid)) l=mid+1,ans=mid;
    		else r=mid-1;
    	}
    	return ans;
    }
    int main()
    {
    	scanf("%d%d",&n,&W);
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d%d",&w[i],&t[i]);
    		t[i]*=1000;
    	}
    	printf("%d",twofen());
    	return 0;
    }
    
  • 相关阅读:
    关于dependency的scope
    Enum
    vim
    postgres函数
    Static块与线程安全
    查看文件夹及文件大小df du
    mac下安装jdk
    硬盘修复原理
    关于Jquery的Accordion在IE下闪烁,不稳定的问题
    vmare安装linux问题总结4(redhat在启动时卡在sendmail很久)
  • 原文地址:https://www.cnblogs.com/karryW/p/10805177.html
Copyright © 2011-2022 走看看