UVa:10132 File Fragmentation

其实想明白了还是道挺简单的题。

 

最大的碎片跟最小的组合中一定有原文件。次最大和次最小的碎片的组合中也一定有原文件。
很明显两个组合中相同的那个文件就是原文件。

因为没有完全相同的碎片,所以即使最大的和最小的碎片都有两个,这个思路也是完全可行的。

 

算是贪心吧,这是解决问题的一个很关键的点。

 

当然如果一共就两块碎片那就不用麻烦了,它俩的组合一定就是答案。

 

今天重做这道题居然一遍AC,想当时被卡了好久。。。
老师说过scanf、printf跟cin、cout混用会导致莫名的现象,因为这里用到了string,所以全换成cin、cout了。

 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(string a,string b)
{
    return a.size()<b.size();
}
int main()
{
    int T;
    cin>>T;
    cin.ignore();
    cin.ignore();
    while(T--)
    {
        string str[150];
        int n=0;
        while(getline(cin,str[n])&&!str[n].empty())n++;
        if(n<=2)
            cout<<str[0]+str[1]<<endl;
        else
        {
        sort(str,str+n,cmp);
        string a=str[0],b=str[1],c=str[n-2],d=str[n-1];
        if(a+d==b+c||a+d==c+b) cout<<a+d<<endl;
        else if(d+a==b+c||d+a==c+b) cout<<d+a<<endl;
        else if(a+c==b+d||a+c==d+b) cout<<a+c<<endl;
        else if(c+a==b+d||c+a==d+b) cout<<c+a<<endl;
        }
        if(T) cout<<endl;
    }
    return 0;
}


 

你可能感兴趣的:(贪心法)