p1116 p1934 超级书架

版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84976790

p1934 [usaco2007dec_bronze]书架

题目

https://www.luogu.org/problemnew/show/P2676

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000100;
inline int read()
{
	int f=1,num=0;
	char ch=getchar();
	while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar(); }
	while (isdigit(ch)) num=(num<<1)+(num<<3)+(ch^48), ch=getchar();
	return num*f;
}
int cnt,sum,h[maxn],f[maxn];
int main()
{
	int n=read(),b=read();
	for (int i=1;i<=n;++i)
		h[i]=read();
	sort(h+1,h+n+1);
	for (int i=n;i>=1;--i)
	{
		if (sum>=b) break;
		sum+=h[i];
		++cnt;
	}
	printf("%d\n",cnt);
	return 0;
}

本人已泪目。。。。。。。。。。。

p1116 超级书架

题目

https://www.luogu.org/problemnew/show/P2677

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000100;
inline int read()
{
    int f=1,num=0;
    char ch=getchar();
    while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar(); }
    while (isdigit(ch)) num=(num<<1)+(num<<3)+(ch^48), ch=getchar();
    return num*f;
}
int sum,h[maxn],f[maxn];
int main()
{
    int n=read(),b=read();
    for (int i=1;i<=n;++i)
        h[i]=read();
    sort(h+1,h+1+n);
    for (int i=1;i<=n;++i)
        sum+=h[i];
    int k=sum-b;
    for (int i=1;i<=n;++i)
        for (int j=k;j>=h[i];--j)
            f[j]=max(f[j],f[j-h[i]]+h[i]);
    printf("%d\n",k-f[k]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84976790