题目说每个相同文件(01串)都被撕裂成两部分,要求拼凑成原来的样子,如果有多种可能输出一种。

我标题写着排列组合,其实不是什么高深的数学题,只要把最长的那几个和最短的那几个凑一起,然后去用其他几个验证就行了,反正我的验证是非常暴力的,看起来。。。(其实加了个二维数组判定不是很吃复杂度)

代码:

#include <string>
#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 150; string p[maxn];
int n, cnt, min, max;
bool flag, used[maxn]; bool cmp (string a, string b) {
return a.size() < b.size();
} bool check(string str) {
for (int i = 0; i < cnt; i++)
for (int j = 0; j < cnt; j++) {
if (!used[i] && !used[j] && p[i] + p[j] == str)
used[i] = used[j] = true;
}//for
for (int i = 0; i < cnt; i++)
if (used[i] == false)
return false;
return true;
} int main() {
cin >> n;
getline(cin, p[0]);
getline(cin, p[0]);
while(n--) {
cnt = 0;
while (getline(cin, p[cnt]) && !p[cnt].empty()) cnt++;
sort(p, p + cnt, cmp);
flag = false;
for (int i = 0; !flag && p[i].size() == p[0].size(); i++)
for (int j = cnt - 1; !flag && p[j].size() == p[cnt - 1].size(); j--) {
memset(used, 0, sizeof(used));
used[i] = used[j] = 1;
if (check(p[i] + p[j])) {
cout << p[i] + p[j] << endl;
flag = true;
break;
}//if
memset(used, 0, sizeof(used));
used[i] = used[j] = 1;
if (check(p[j] + p[i])) {
cout << p[j] + p[i] << endl;
flag = true;
break;
}//if
}//for
if (n)
printf("\n");
}//while
return 0;
}

UVa Problem 10132 File Fragmentation (文件还原) 排列组合+暴力的更多相关文章

  1. UVa 10132 - File Fragmentation

    题目大意:有n个相同的文件,每个文件从中间分为两半,现在给你这2n个文件碎片,求原来完整的文件. 找出文件碎片长度的最大值和最小值,二者相加可得到原来文件的长度len.然后逐个进行拼接,将拼接后长度等 ...

  2. UVA 10098 用字典序思想生成所有排列组合

    题目: Generating permutation has always been an important problem in computer science. In this problem ...

  3. uva 11174 Stand in a Line (排列组合)

    UVa Online Judge 训练指南的题目. 题意是,给出n个人,以及一些关系,要求对这n个人构成一个排列,其中父亲必须排在儿子的前面.问一共有多少种方式. 做法是,对于每一个父节点,将它的儿子 ...

  4. matlab之编写函数m文件计算排列组合Cnm

    function y=myfun(n) y=1; for i in 1:n; y=y*(m-i+1)/i; end 给y赋初值 给i遍历 计算每一项的乘积之和 注意:要保存函数的名字为myfun,因为 ...

  5. Codeforces Round #181 (Div. 2) C. Beautiful Numbers 排列组合 暴力

    C. Beautiful Numbers 题目连接: http://www.codeforces.com/contest/300/problem/C Description Vitaly is a v ...

  6. Navicat操作SQL server 2008R2文件.bak文件还原

    项目操作过程中,利用Navicat操作SQL Server2008R2数据备份,结果发现数据丢失了很多,不得不先对数据丢失部分进行差异对比,然后再重新输入. 1.利用Navicat导出的数据格式为sq ...

  7. MSSQL在线文件还原脚本

    在线文件还原:如果比较大的MSSQL数据库的损坏只是集中在其中某一个文件或者文件组上,使用在线文件还原技术,只是把坏掉的数据文件或者文件组重建,能节约很多时间.以下是测试脚本(假设损坏的文件时Trn0 ...

  8. MySQL frm+ibd文件还原data的办法【数据恢复】

    MySQL frm+ibd文件还原data的办法[数据恢复] 此方法只适合innodb_file_per_table          = 1 当误删除ibdata 该怎么办? 如下步骤即可恢复: 1 ...

  9. JAVASE02-Unit06: 文件操作——File 、 文件操作—— RandomAccessFile

    Unit06: 文件操作--File . 文件操作-- RandomAccessFile java.io.FileFile的每一个实例是用来表示文件系统中的一个文件或目录 package day06; ...

随机推荐

  1. sql server中的decimal或者numeric的精度问题

    何谓精度:最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数.该精度必须是从 1 到最大精度 38 之间的值.默认精度为 18. 小数位数:小数点右边可以存储的十进制数字的最大位数.小数位数 ...

  2. wcf+linq to sql中关联查询返回数据问题

    前段时间准备采用wcf+nh框架开发sl程序,发现采用nh开发不适合我的中型.并且快速开发项目,所以综合考量了下,决定采用wcf+linq to sql . 但是此模式也有缺点,也是linq to s ...

  3. 使用servlet实现文件上传

    package com.zhanghaobo.fileupload; import java.io.File; import java.io.IOException; import java.util ...

  4. JavaScript事件处理的三种方式(转)

    一.什么是JavaScript事件? 事件(Event)是JavaScript应用跳动的心脏,也是把所有东西粘在一起的胶水,当我们与浏览器中Web页面进行某些类型的交互时,事件就发生了. 事件可能是用 ...

  5. Jquery 操作 radio选中值

    1.获取radio选中值 1.1  $('input:radio:checked').val(); 1.2  $("input[type='radio']:checked").va ...

  6. 【转】2D动画:view的Matrix

    Matrix,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 首先介绍一下矩阵运算.加法和减法就不用说了,太简单了,对应位相加就好.图像处理,主要用到的是乘法 ...

  7. 微软自带报表rdlc操作(合并同数据项)

    一.使用table合并数据项(隐藏相同数据项). 1.添加table,添加各数据项目和表头. 2.添加分组,选中table1右键属性->组->添加. 3.右键需要隐藏数据项的列->属 ...

  8. linux 安装Apache----tar.gz文件安装方式(零环境安装)

    一.下载apache源代码 1.下载地址:http://httpd.apache.org/download.cgi  找稳定的最新的版本(Stable Release) 得到文件 httpd-2.4. ...

  9. UVA1151

    //感觉刘汝佳老师的思维真的太厉害了orz /*摘录书上的一段话: 只需一个小小的优化即可降低时间复杂度:先求一次原图(不购买任何套餐)的最小生 成树,得到n-1条边,然后每次枚举完套餐后只考虑套餐中 ...

  10. Flex坐标

    flash和flex针对不同的目的,提供了3种不同的坐标系. 全局的就是(stage级别的) 本地坐标系(组件级别的) 内容坐标系(相对于本地坐标系说的) 这些坐标系的点是可以转换的,并且有相应的方法 ...