题解:P13256 [GCJ 2014 #2] Data Packing
题目传送门
这是一道比较简单的贪心题。
主要思想是:每次选择两个大小不超过光盘容量 XXX 且大小最接近 XXX 的文件,将他们存在一张光盘上,如果没有符合条件的两个光盘,就每张光盘存一个文件。
那么我们可以使用两个指针,一个从最小文件开始(左指针),一个从最大文件开始(右指针),尝试将最大的文件和最小的文件配对放在同一张光盘上。
-
如果两者之和 ≤X\le X≤X ,则可以配对,使用一张光盘。
-
如果两者之和$ > X$ ,则最大的文件必须单独使用一张光盘。
代码
#include<bits/stdc++.h>
using namespace std;int main(){int T;cin>>T;int t=T;//输出时需要用while(T--){int n,x;cin>>n>>x;vector<int>S(n);for(int i=0;i<n;i++) cin>>S[i];sort(S.begin(),S.end());//排序int i=0,j=n-1,cot=0;while(i<=j){if(S[i]+S[j]<=x){//如果能配对i++;j--;//一张光盘存两个文件}else{//不能的话j--;//一张光盘存一个文件 }cot++;}cout<<"Case #"<<(t-T)<<':'<<cot<<endl;}
}