uva 全排列题目 146 + 729 + 10098

解题思路:      对于全排列的问题,STL,提供了一个强大的函数,

                                bool   next_permutation(iterator.begin() ,  iterator.end());

                       对于当前的序列如果不是最后一个序列则返回真,否则返回假。

uva     10098 - Generating Fast 

题目链接: 点击打开链接

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <algorithm>
using namespace std;

string str;
int main(){
    int n;
    scanf("%d" , &n);
    while(n--){
        string str;
        cin>>str;
        while(next_permutation(str.begin() , str.end())){
            cout<<str<<endl;
        }
        cout<<endl;
    }
    return 0 ;
}

uva  729 - The Hamming Distance Problem

题目链接:点击打开链接

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

int main() {
    int Case , n, h;
    bool first = true;
    scanf("%d" , &Case);
    while(Case--){
        if(first)
          first = false;
        else
          printf("\n");
        string str;
        scanf("%d%d", &n, &h);
        for (int i = 0; i < n; i++) {
            if (i >= n - h)
               str += '1';
            else
               str += '0';
        }
        cout<<str<<endl;
        while (next_permutation(str.begin(), str.end()))
              cout << str << endl;
    }
    return 0;
}

uva  146 - ID Codes

题目链接:点击打开链接

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std;

string str;

int main(){
    while(cin>>str){
        if(str == "#")
            break;
        if(next_permutation(str.begin(),str.end()))
            cout<<str<<endl;
        else
            printf("No Successor\n");
    }
    return 0;
}
时间: 2024-08-29 11:51:24

uva 全排列题目 146 + 729 + 10098的相关文章

算法:UVa 11572

题目大意: 给n个数, n<=100W,求一个连续子序列,这个子序列中没有重复的数,问这个子序列最长是多少? 思路: 开一个数组pos,  pos[ x ] 表示x出现的位置, 这个数组初始化为-1 用一个变量start来记录当前枚举序列的起点,初始为0 然后枚举这个序列,依次记录每个数的位置, 假设当前枚举到i, 在记录这个位置之前,先检查当前这个数的位置pos[ arr[i] ]是否大于等于start,如果大于,说明这个数已经在[start, i-1]中已经出现过了,记下这个满足条件的子序列

uva 10400 - Game Show Math

点击打开链接uva 10400 题目意思:     给定n个数和一个目标数,问我们能否找到一个表达式使得这n个数算出来最后的结果等于这个目标值,注意这里的所有运算的优先级一样,都是从左向右的. 解题思路:     1:思路:DFS+状态判重                        2:由于这一题的时间给了20s,那么DFS是没问题的.我们只要从第一个开始进行DFS,然后每一次当前是否满足一下条件:1 当前和-32000<=sum<=32000    2当前的状态vis[i][sum]没有

uva 757 - Gone Fishing

点击打开链接uva 757 题目意思:            john现有h个小时的空闲时间,他打算去钓鱼.john钓鱼的地方共有n个湖,所有的湖沿着一条单向路顺序排列(john每在一个湖钓完鱼后,他只能走到下一个湖继续钓), john必须从1号湖开始钓起,但是他可以在任何一个湖结束他此次钓鱼的行程.           john在每个湖中每5分钟钓的鱼数(此题中以5分钟作为单位时间),随时间的增长而线性递减.而每个湖中头5分钟可以钓到的鱼数以及每个湖中相邻5分钟钓鱼数的减少量,input中均会

刘汝佳uva 字符串专题

第一题   palindrome 点击打开链接uva 401 题目意思:给定一个字符串判断是什么类型 分析: 1 根据输出我们知道这个字符串总共有4种类型 2 首先应该是否是"palindrome ",判断的理由很简单直接对这个字符串进行判断,但是这里有个地方会出错就是'0'和'O',题目明确说明了'0'和'O'看成相同,所以我们应该在输入的时候就把所有的'0'处理成'O',注意这里不能把'O'改成'0'(想想为什么?) 3 接下来判断是否是"mirrored string&

uva 10670 - Work Reduction

点击打开链接uva 10670 题目意思: 有N个文件需要处理,现在老板要求在某天之后这些文件只能剩下M个,否则你就被炒鱿鱼了.现在没办法只有雇别人在做了,现在呢有两种工人A 和 B.A工人是付费给他A,他帮你处理一个文件,B工人是付费给他B帮你处理一半的文件.由于雇佣公司很多有L家,所以你为了能够省钱右不被老板炒鱿鱼所以就开始计算到底雇哪一家才能够最省钱呢,所以你现在目的就是要对这些公司所需要的付费进行排序输出. 解题思路: 1:贪心 2:分析如下:假设当前有n个文件,那么n->n/2这个过程

uva 714 - Copying Books

点击打开链接uva 714 题目意思:   把一个正整数序列划分成m个连续的子序列(每一个整数恰好属于每一个序列),设第i个序列的和为s(i),现在我们的任务就是让所有的S(i)的最大值尽量小. 解题思路:     1:最大值最小化问题:把一个正整数序列划分成m个连续的子序列(每一个整数恰好属于每一个序列),设第i个序列的和为s(i),现在我们的任务就是让所有的S(i)的最大值尽量小.                        2:最大值最小化问题是一种很常见的优化目标.我么考虑一下新的问题

poj 2560 uva 10034 - Freckles

点击打开链接uva 10034 题目意思:  给定n个点的坐标,要求找到最短的路径将这些点链接起来 思路:  Prime + 最小生成树 分析:  给定n个点的坐标,要求找到最短路.很明显的最小生成树的题目,利用Prime就可以.这里记得要先求出每一条边的长度 代码: #include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<cmath>

uva 10245 - The Closest Pair Problem

点击打开链接uva 10245 题目意思:   给定N个点,找到所有点中距离最小的 解题思路: 1:递归+分治 <网上大牛的解释如下> 2在二维空间里,可用分治法求解最近点对问题.预处理:分别根据点的x轴和y轴坐标进行排序,得到X和Y,很显然此时X和Y中的点就是S中的点.            1情况(1):点数小于等于三时:                                  2情况(2):点数大于三时:            3首先划分集合S为SL和SR,使得SL中的每一个点

uva 10720 - Graph Construction

点击打开链接uva 10720 题目意思:   给定n个顶点的度,判断当前的这些顶点能否构成图 解题思路:   1: 贪心 2: Havel定理(证明可图化)   可简单图化的判定:把序列排成不增序,即d1>=d2>=-->=dn,则d可简单图化当且仅当d'={d2-1,d3-1,--d(d1+1)-1, d(d1+2),d(d1+3),--dn}可简单图化.简单的说,把d排序后,找出度最大的点(设度为d1),把它与度次大的d1个点之间连边,然后这个点就可以不管了,一直继续这个过程,直到