站外题求调
  • 板块学术版
  • 楼主zhang_fengrui
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/3/31 22:38
  • 上次更新2024/4/1 13:00:49
查看原帖
站外题求调
1296840
zhang_fengrui楼主2024/3/31 22:38
517 遇到了前所未有的大危机!

他突发奇想,想下载 世界计划 彩色舞台 feat. 初音未来 ,却发现自己的手机容量不够用了。

但是作为 ACM 领域高手,517 自然不会轻易放弃。他发现一个 app 的安装有两个指标 d_i和 s_i
  ,前者表示安装包大小,后者表示安装完成后大小。

一个 app 在安装包下载完成后会自动安装。这意味着如果想下载一个 app ,至少需要 max(d_i, s_i)的空间。

但是 517 发现,一些 app 的 s_i < d_i
  ,这意味这其安装完成后变小了。这方便了后续的下载。

现在 517 清空了自己的手机,并列出了他想下载的 app 列表,并尝试用最佳的顺序使得能够下载的 app 数量最多。请问他最多能下载多少个 app ?

输入
第一行,两个正整数 n,m表示 app 数量和手机容量。

接下来 n 行 ,每行两个正整数表示 s_i,d_i。

输出
共一行,一个整数表示答案。

样例
输入 1复制
5 20
10 8
10 9
9 5
1 8
8 4
输出 1复制
3
提示
1 <= n,m <= 10^3
 

1 <= d_i,s_i <= 10^3

这个是我的代码:

# include <bits/stdc++.h>
using namespace std;
struct node{
	int d,s,cha;
}a[100010];
bool cmp(node x,node y)
{
	return x.cha < y.cha;
}
int dp[1010][1010],cnt[10010];
int main (){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i++)
	{
		scanf("%d%d",&a[i].d,&a[i].s);
		a[i].cha = a[i].s-a[i].d;
	}
	sort(a+1,a+n+1,cmp);
	for(int i = 1;i <= n;i++)
	{
		for(int j = m;j >= 0;j--)
		{
			dp[i][j] = dp[i-1][j];
			if(j >= max(a[i].d,a[i].s))
			{
				dp[i][j] = max(dp[i][j],dp[i-1][j-max(a[i].d,a[i].s)]+1);
			}
		}
	}
	int mx = 0;
	for(int i = 1;i <= n;i++)
	{
		for(int j = m;j >= 0;j--)
		{
//			cout << dp[i][j] << " ";
			mx = max(mx,dp[i][j]);
		}
		cout << endl;
	}
//	cout << mx << endl;
	return 0;
} 

只拿了个20分,不知道哪里有问题,求求各位帮忙调一下吧

2024/3/31 22:38
加载中...