COJ1229-压缩文件

来源:互联网 发布:天翼飞young客户端mac 编辑:程序博客网 时间:2024/06/07 13:41

1229: 压缩文件

Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 100 Solved: 50
Description
Staginner得知gestapolur的y570上有《使命召唤8》时,便决定copy到自己的本子上亲自过把瘾,但无奈《使命召唤8》如果压缩成一个文件Staginner的U盘是装不下的。
好在gestapolur告诉Staginner使用WinRAR可以在压缩的时候设定压缩分卷大小,这样就可以在压缩的时候将压缩文件分成若干个part且这些文件总大小和压缩成一个文件时是一样的。比如如果压缩成一个文件时《使命召唤8》是10250MB,设定的压缩分卷大小是500MB,那么最后就会产生21个part,其中有20个是500MB的,还有1个是250MB的,这也说明了在压缩过程中会优先生成大小等于压缩分卷值的part,当剩余的文件大小不足压缩分卷值时,剩余文件会作为最后一个part生成。
已知Staginner一共有N个U盘及其各自的剩余容量,《使命召唤8》压缩成一个文件时的大小是M,现在他想知道如果一个U盘里面只能存储一个part,那么在保证使用的U盘数尽可能少的情况下,压缩分卷大小最大可以设置为多少?
Input
输入包含若干组数据,每组数据的第一行为一个正整数N(1<=N<=100),和一个正整数M(0< M<=10^9),表示的含义同上,其中M的单位为MB。接下一行有N个不超过10^9的正整数,分别描述了N个U盘的剩余容量,单位同样为MB。
数据组数不超过100组,读入以EOF结束。
Output
对于每组数据,用一行输出一个整数,表示若一个U盘里面只能存储一个part,在保证使用的U盘数尽可能少的情况下,设定的压缩分卷大小的最大值。
如果Staginner无论如何设定压缩分卷大小,都没办法在一个U盘里面只能存储一个part前提下存储下所有的part,输出-1即可。
Sample Input
3 1500
500 500 500

4 1500
100 600 700 800

3 1500
200 1000 400
Sample Output
500
800
-1
Hint
Source
CSU Monthly 2012 Jan.

题目大意: 给你n个容量各不相同的U盘,要将一个大小为m的文件分割成若干固定大小部分,若剩余不足固定大小,则为剩余量,要用这些U盘装下这个文件,问固定大小最大是多少?
解题思路:类似模拟,从最大容量的U盘开始,逐一去试即可。因为最大固定大小一定是U盘容量中的一个。

#include<iostream>#include<string>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<map>#include<iomanip>using namespace std;const int MAXN=1e4;int a[105];int n,m;int main(){    while(cin>>n>>m)    {        for(int i=1;i<=n;i++)            cin>>a[i];        sort(a+1,a+n+1);        int ans=0;        bool flag=false;        for(int i=n;i>=1;i--)        {            if(flag) break;            int num=m/a[i];            int res=m%a[i];            int sum=0,cnt=0;            for(int j=n;j>=1;j--)            {                if(a[j]>=a[i])                {                    cnt++;                }                if(cnt==num&&res==0)                {                    flag=true;                    ans=a[i];                    break;                }                if(cnt==num&&res!=0)                {                    if(j>1&&a[j-1]>=res)                    {                        flag=true;                        ans=a[i];                        break;                    }                }            }        }        if(ans==0) cout<<-1<<endl;        else cout<<ans<<endl;    }    return 0;}
原创粉丝点击