一个失败的案例:(POJ 1009)

题目描述

小翔同学的宿舍WIFI添加了密码,密码每天都会变更。而小翔每天都会给蹭网的同学们提供密码提示。现在请你根据密码提示,编写程序破译密码。 已知密码提示给出了n个整数 a1,a2,…,an,以及一个整数 t(t小于n)。从这n个整数中任选t个相加,可分别得到一系列的和。例如当 n=4,t=3,4 个整数分别为 3,7,12,19 时,可得全部组合的和分别为:

3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。 而和为素数的个数即为小翔宿舍WIFI的密码。

例如上例,只有一种的和为素数:3+7+19=29,于是密码即为1。

输入

n , t (1<=n<=20,t<n) a1,a2,…,an (1<=ai<=5000000)

样例输入

4 3 3 7 12 19

样例输出

1
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<math.h> using namespace std;
long d[],*head;
int i,n,t,sum=,mark=,Q; int fun(int ns)
{
int j,m;
m=(int)sqrt(ns);
for(j=;j<=m;j++)
{
if(!(ns%j))
{return ;}
}
return ;
} int permutation()
{
if(Q<t){cout<<n<<Q<<t<<"$"; return mark;}
do
{
for(i=;i<t;i++)
{
sum=sum+d[i];
cout<<d[i]<<"*";
}
if(fun(sum)==)
{
mark++;
}
sum=;
}while(next_permutation(d,d+Q));
Q--;cout<<"!";
permutation();
} int main()
{
freopen("stdin.txt","r",stdin);
while(scanf("%d %d",&n,&t)!=EOF)
{
for(i=;i<n;i++)
{
scanf("%ld",&d[i]);
}
Q=n;
cout<<permutation()<<endl;
mark=n=t=;
}
return ; //相同时合并,缺少情况
}

next_permutation遇到同次相同序列会合并,用到这道题会出错,要注意用的条件,这道题用DFS即可,这道题撸了三天我也是醉了。

正解:

 #include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
int i=,j,sum,num,n,t;
long int d[];
int fun(int n)
{
int m;
m=(int)sqrt(n);
for(j=;j<=m;j++)
{
if(!(n%j))
{return ;}
}
return ;
} void dfs(int abc,int i,int sum)
{
if(abc==t&&fun(sum))
{num++;return;}
for(int j=i;j<n;j++)
{dfs(abc+,j+,sum+d[j]);}
} int main()
{
while(scanf("%d%d",&n,&t)!=EOF)
{
for(int i=;i<n;i++)
scanf("%ld",&d[i]);
dfs(,,);
cout<<num<<endl;
num=sum=;
}
return ;
}
/**************************************************************
Problem: 1009
User: 2014217052
Language: C++
Result: 正确
Time:4 ms
Memory:1516 kb
****************************************************************/

几种常见用法:

#include<iostream>

#include<string.h>

#include<algorithm>

using namespace std;

int main()

{

char d[100];

cin>>d;

sort(d,d+strlen(d));

char *first=d;

char *last=d+strlen(d);

do{

cout<<d<<endl;

}while(next_permutation(first,last));

return 0;

}

////////////////////////////////////////////

#include<iostream>

#include<string.h>

#include<algorithm>

using namespace std;

int main()

{

char d[100];

cin>>d;

sort(d,d+strlen(d));

char *first=d;

char *last=d+strlen(d);

do{

cout<<d<<endl;

}while(next_permutation(first,last));

return 0;

}

//////////////////////////////////////////

#include<iostream>

#include<string.h>

#include<algorithm>

using namespace std;

int main() {

string dog;

while(cin>>dog&&dog!="@")

{

sort(dog.begin(),dog.end());

while(next_permutation(dog.begin(),dog.end()))

{

cout<<dog<<endl;

}

}

}

///////////////////////////////////////

next_permutation 和 一个不成功的案例的更多相关文章

  1. 通过一个生活中的案例场景,揭开并发包底层AQS的神秘面纱

    本文导读 生活中案例场景介绍 联想到 AQS 到底是什么 AQS 的设计初衷 揭秘 AQS 底层实现 最后的总结 当你在学习某一个技能的时候,是否曾有过这样的感觉,就是同一个技能点学完了之后,过了一段 ...

  2. SpringBoot系列之三_一个完整的MVC案例

    这一节让我们来做一个完整的案例. 我们将使用MyBatis作为ORM框架,并以非常简单的方式来使用MyBatis,完成一个完整的MVC案例. 此案例承接上一节,请先搭建好上一节案例. 一.数据库准备 ...

  3. SQL Server一个特殊的阻塞案例分析2

    最近发现一个非常奇怪的阻塞问题,如下截图所示(来自监控工具DPA),会话583被会话1036阻塞,而且阻塞发生在tempdb,被阻塞的SQL如下截图所示,会话等待类型为LCK_M_S 因为DPA工具不 ...

  4. Java事务处理全解析(四)—— 成功的案例(自己实现一个线程安全的TransactionManager)

    在本系列的上一篇文章中我们讲到,要实现在同一个事务中使用相同的Connection对象,我们可以通过传递Connection对象的方式达到共享的目的,但是这种做法是丑陋的.在本篇文章中,我们将引入另外 ...

  5. PHP写一段代码,确保多个进程同时写入一个文件成功

    这个需求是在软件设计过程常见的加锁.学计算机的同学都应该知道,这个是在<计算机操作系统>课程上有这个知识点.主要要考虑的是进程的同步,也就是进程对资源的互斥访问.OK,用程序说话吧! &l ...

  6. 一个小时成功安装SQL Server 2012图解教程

    在安装微软最新数据库SQL Server 2012之前,编者先确定一下安装环境:Windonws 7 SP1,32位操作系统.CPU是2.1GHz赛扬双核T3500,内存2.93GB. 安装SQL S ...

  7. Java基础知识强化46:StringBuffer类之判断一个字符串是否对称案例

    1. 分析:判断一个字符串是否是一个对称的字符串,我们只需要把字符串的第1个字符和最后1个字符,第2个字符和倒数第2个字符,…… 比较的次数是长度除以2.  方法1:通过取取索引对应值来进行一一比对 ...

  8. 记录一次raid数据恢复及回迁成功的案例

    故障发生在两块盘组成的一个raid0上,其中的一块盘亮黄灯,被raid卡踢出后,raid崩溃,下面就把当时抢救数据的整个过程进行介绍. 由于硬盘是两块SAS 300G的硬盘,先把硬盘从机器中拔出来,然 ...

  9. 使用session和cookie实现用户登录:一个登录页面,一个servlet,一个登录成功页面

    文件目录 1.登录页面 <%@ page language="java" contentType="text/html; charset=utf-8" p ...

随机推荐

  1. java多线程-Condition

    Condition 将 Object 监视器方法(wait.notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set ...

  2. nginx下禁止访问robots.txt的设置方法

    关于robots.txt文件:搜索引擎通过一种程序robot(又称spider),自动访问互联网上的网页并获取网页信 息.您可以在您的网站中创建一个纯文本文件robots.txt,在这个文件中声明该网 ...

  3. 【Gym 100015B】Ball Painting

    题 There are 2N white balls on a table in two rows, making a nice 2-by-N rectangle. Jon has a big pai ...

  4. python_元组

    元组 元组是用圆括号括起来的,其中的元素之间用逗号隔开.(都是英文半角) >>># 变量引用 str >>> s = "abc" >> ...

  5. BZOJ-3231 递归数列 矩阵连乘+快速幂

    题不是很难,但是啊,人很傻啊...机子也很鬼畜啊... 3231: [Sdoi2008]递归数列 Time Limit: 1 Sec Memory Limit: 256 MB Submit: 569 ...

  6. 【蒟蒻の进阶PLAN】 置顶+持续连载

    看到周围神犇们纷纷列计划,本蒟蒻也决定跟随他们的步伐,计划大约是周计划吧,具体怎么安排我也不确定.. 2015.12.30 刚刚学习完最基础的网络流,需要进行这方面的练习,从简到难,有空余的话尝试学习 ...

  7. POJ1325 Machine Schedule

    Description As we all know, machine scheduling is a very classical problem in computer science and h ...

  8. Android 使用Parcelable序列化对象

    转:http://ipjmc.iteye.com/blog/1314145       Android序列化对象主要有两种方法,实现Serializable接口.或者实现Parcelable接口.实现 ...

  9. goto,void,extern,sizeof实例

    1.#include <stdio.h>void func(int n){    int* p = NULL;    if(  n < 0 )    {        goto ST ...

  10. jdk版本

    windows: set java_home:查看JDK安装路径 java -version:查看JDK版本 linux: whereis java which java (java执行路径) ech ...