求助
查看原帖
求助
177878
金庆涵楼主2022/7/4 17:56

我在本题遇到了一些麻烦

#include<bits/stdc++.h>
using namespace std;

struct node {
	int h, t;
};
bool cmp(const node &x, const node &y) {
	return x.h > y.h;
}

int f[3][2200][2200];
node x[100];

int main() {
	int n;
	scanf("%d", &n);
	for (register int i(1); i <= n; ++i)
		scanf("%d%d", &x[i].h, &x[i].t);
		
	sort(x + 1, x + 1 + n, cmp);
	long long ans(LONG_LONG_MAX);
	int sum(0);
	for (register int i(1); i <= n; ++i) {
		sum += x[i].t;
		int o(i & 1);
		for (register int a(0); a <= sum; ++a)
			for (register int b(0); b <= sum - a; ++b) {
				f[o][a][b] = INT_MAX;
				int c(sum - a - b);
				if (x[i].t == a) f[o][a][b] = min(f[o][a][b], f[o ^ 1][0][b] + x[i].h);
				if (x[i].t < a) f[o][a][b] = min(f[o][a][b], f[o ^ 1][a - x[i].t][b]);
				if (x[i].t == b) f[o][a][b] = min(f[o][a][b], f[o ^ 1][a][0] + x[i].h);
				if (x[i].t < b) f[o][a][b] = min(f[o][a][b], f[o ^ 1][a][b - x[i].t]);
				if (x[i].t == c) f[o][a][b] = min(f[o][a][b], f[o ^ 1][a][b] + x[i].h);
				if (x[i].t < c) f[o][a][b] = min(f[o][a][b], f[o ^ 1][a][b]);
			}
	}
	for (register int a(1); a <= sum; ++a)
		for (register int b(1); b <= sum - a; ++b) {
			int c(sum - a - b);
			if (c <= 0) continue;
			if (f[n & 1][a][b] >= 0)
				ans = min(ans, (long long)f[n & 1][a][b] * (long long)max(max(a, b), c));
		}
	printf("%lld\n", ans);
	return 0;
}

该代码题交评测只有10pts。

#include<bits/stdc++.h>
using namespace std;
struct node{
	int h,t;
}x[100];
bool cmp(node x,node y){
	return x.h>y.h;
}
int f[3][2200][2200];
int n,m,i,a,b,sum,c,o;
long long ans;
int main()
{
	scanf("%d",&n);
	for (register int i=1;i<=n;i++)
		scanf("%d %d",&x[i].h,&x[i].t);
	sort(x+1,x+1+n,cmp);
	ans=100000000;
	f[0][0][0]=0;
	for (register int i=1;i<=n;i++)
	{
		sum+=x[i].t;
		o=i&1;
		for (register int a=0;a<=sum;a++)
			for (register int b=0;b<=sum-a;b++)
			{
				f[o][a][b]=100000000;
				c=sum-a-b;
				if (x[i].t==a) f[o][a][b]=min(f[o][a][b],f[o^1][0][b]+x[i].h);
				if (x[i].t<a) f[o][a][b]=min(f[o][a][b],f[o^1][a-x[i].t][b]);
				if (x[i].t==b) f[o][a][b]=min(f[o][a][b],f[o^1][a][0]+x[i].h);
				if (x[i].t<b) f[o][a][b]=min(f[o][a][b],f[o^1][a][b-x[i].t]);
				if (x[i].t==c) f[o][a][b]=min(f[o][a][b],f[o^1][a][b]+x[i].h);
				if (x[i].t<c) f[o][a][b]=min(f[o][a][b],f[o^1][a][b]);
			}
	}
	for (register int a=1;a<=sum;a++)
		for (register int b=1;b<=sum-a;b++){
			int c=sum-a-b;
			if(c<=0) continue;
			if (f[n&1][a][b]>=0)
			ans=min(ans,(long long)f[n&1][a][b]*(long long)max(max(a,b),c));
		}
	printf("%lld\n",ans);
}

老师给出的标程是满分,可是我并没有找到实质性的不同,可以帮忙看一下有什么不同的吗

2022/7/4 17:56
加载中...