uva - 10132 - File Fragmentation(贪心)

题意:一堆文件,所有文件都是同样的内容——一串由0和1组成的字串。不小心全部撕成了两份,撕裂的位置都不同,根据这些碎片还原出那个字符串。

方法:把所有的碎片按照长度排序,最短必定对应最长。因为有可能撕成相等长度的两份,所以取最短的两个和最长的两个。枚举所有组合,一样则输出。

注意:输入有点难搞,输入的时候样例之间有空行,根据这个划分样例,最后一个根据EOF。

#include <iostream>  
#include <iomanip>  
#include <string>  
#include <cstring>  
#include <cstdio>  
#include <queue>  
#include <stack>  
#include <algorithm>  
#include <cmath>  

using namespace std;

#define MAX 300

struct File
{
	char s[MAX];
	int len;
};

int num;
File file[MAX];

void Input()
{
	int i = 0;
	char temp[MAX];
	while (true)
	{
		if (gets(temp) == NULL || strlen(temp) == 0)
			break;
		strcpy(file[i].s, temp), file[i].len = strlen(temp);
		i++;
		num++;
	}
}

int cmp(const void *a, const void *b)
{
	return (*(File *)a).len - (*(File *)b).len;
}

int Judge(File a, File b, File c, File d)
{
	char temp_1[MAX], temp_2[MAX];
	strcpy(temp_1, a.s), strcat(temp_1, b.s);
	strcpy(temp_2, c.s), strcat(temp_2, d.s);
	if (!strcmp(temp_1, temp_2))
	{
		puts(temp_1);
		return 1;
	}
	else
		return 0;
}

void Connect()
{
	if (Judge(file[0], file[num-2], file[1], file[num-1]))	return;
	else if (Judge(file[0], file[num-2], file[num-1], file[1]))	return;	
	else if (Judge(file[num-2], file[0], file[1], file[num-1]))	return;
	else if (Judge(file[num-2], file[0], file[num-1], file[1]))	return;
	else if (Judge(file[0], file[num-1], file[1], file[num-2]))	return;
	else if (Judge(file[0], file[num-1], file[num-2], file[1]))	return;
	else if (Judge(file[num-1], file[0], file[1], file[num-2]))	return;
	else if (Judge(file[num-1], file[0], file[num-2], file[1]))	return;
}

int main()
{
#ifdef Local  
	freopen("a.in", "r", stdin);  
#endif  
	int t = 0;
	cin >> t;
	getchar(), getchar();
	while (t--)
	{
		memset(file, 0, sizeof(file));
		num = 0;
		Input();
		qsort(file, num, sizeof(file[0]), cmp);
		Connect();
		if (t)
			cout << endl;
	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值