列表

详情


NC200617. L-JAJA_Xin的小心思

描述

    快放寒假了,虽然时间还早,但JAJA_Xin已经准备着回家了。他只有一个行李箱,行李箱的容积为m。但是他的行李又很多,所以他去网购了n个压缩袋,并把他的行李分装成了n个袋子,第i个装好的袋子有初始体积ai,压缩后的体积为bi,但JAJA_Xin比较懒,他希望能尽量少压缩几个袋子就把所有行李装进行李箱,现已知所有的ai和bi,他至少要压缩几个袋子才能把行李装进行李箱?
    一顿sao操作之后,他算好了要压缩几个袋子,jx队长从背后拍了一下他的肩:“怎么,想溜了?乖乖留下集训吧

输入描述

多测试用例,保证 ∑n≤107
每组用例的第一行包含两个整数n和m(1≤n≤105,1≤m≤109)。
接下来输入有n行,第i行有两个整数ai和bi(1≤ai,bi≤109, bi<ai)。

输出描述

请输出需要压缩几个袋子。
如果无法装进行李箱,请输出-1。

示例1

输入:

3 10
5 2
6 4
4 3

输出:

2

说明:

JAJA_Xin可以压缩第一和第二个袋子,因此在这些压缩之后,大小之和将2+4+4=10≤10。请注意,压缩任何单独一个袋子不足以把所有行李都装进行李箱(例如,压缩第三个袋子,大小之和5+6+3=14>10)

示例2

输入:

3 8
5 3
6 4
4 2

输出:

-1

说明:

JAJA_Xin压缩所有的袋子,大小之和将3+4+2=9>8,无法装进行李箱。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 894ms, 内存消耗: 1124K, 提交时间: 2020-05-17 19:54:43

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
ll a[100005];
ll n,m;
ll sum;
ll h,k;
ll ans;
int main(){
	while(cin>>n>>m){
		sum=0;
		for (int i=0;i<n;i++){
			cin>>h>>k;
			sum+=h;
			a[i]=h-k;
		}
		sort(a,a+n);
		int i=n-1;
		ans=0;
		while(sum>m && i>=0){
			sum-=a[i];
			ans++;
			i--;
		}
		if (sum>m){
			cout<<-1<<endl;
		}
		else{
			cout<<ans<<endl;
		}
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 298ms, 内存消耗: 14748K, 提交时间: 2020-07-17 12:00:48

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

struct node
{
	int a,b;
}R[100005];
bool cmp(node x,node y)
{
	return x.a-x.b>y.a-y.b;
}
int main()
{
	int i,n,m,ans;
	long long s;
	while(~scanf("%d%d",&n,&m))
	{
		ans=s=0;
		for(i=0;i<n;i++)scanf("%d%d",&R[i].a,&R[i].b),s+=R[i].a;
		sort(R,R+n,cmp);
		for(i=0;s>m&&i<n;i++)s+=R[i].b-R[i].a,ans++;
		if(i==n&&s>m)ans=-1;
		printf("%d\n",ans);
	}
}

上一题