一个失败的案例:(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. C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)

    前言 IEnumerable.IEnumerator到现在为止对这两个接口还是不太理解,不理解但是自己总是想着试着要搞明白,毕竟自己用的少,所以在此先记录一下.以备自己日后可以来翻查,同时也希望园子里 ...

  2. 项目笔记---Windows Service调用Windows API问题

    概要 此文来自于最近一个“诡异”的Windows API调用发现Windows Service在调用某些Windows API的过程中失效,在经过漫长的Baidu,之后终于在StackOverFlow ...

  3. DOM系列---DOM操作表格

    DOM在操作生成HTML上,还是比较简明的.不过,由于浏览器总是存在兼容和陷阱,导致最终的操作就不是那么简单方便了.本篇章主要了解一下DOM操作表格. 一.操作表格 <table>标签是H ...

  4. 第二节Unity3D开发环境安装(windows系统)

        这一节准备安装开发环境. 1. 首先先下载软件包:http://pan.baidu.com/s/1imYVv  4.2版本2.下载完后,解压会看到两个文件(运行第二个安装包) 3.准备安装,这 ...

  5. HashMap的一些用法

    1.HashMap的遍历 //这个是通过 迭代器iterator 来实现 HashMap的遍历 Iterator iterator=hashMap.keySet().iterator(); while ...

  6. struts2中怎么把action中的值传递到jsp页面

    对于如何把struts2的action中的值传到jsp页面中,主要的方法有2种: 使用转发视图利用request域中储存所需的值 使用重定向时存储数据进入session使其在jsp中可以获得 下面,让 ...

  7. __name__和__main的含义

    if __name__ == "__main__": main() This module represents the (otherwise anonymous) scope i ...

  8. RPD资料库创建(1)

    BI创建(数据)分析.仪表盘.报表前,都需要对数据进行建模,在oracle biee里称为创建“资料档案库”-该文件后缀为RPD,所以一般也称为创建RPD文件. 步骤: 1.从windows开始菜单里 ...

  9. POJ2594 Treasure Exploration

    Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8193   Accepted: 3358 Description Have ...

  10. JSP登录验证并显示信息

    加入C标签: 加入jstl.jar 和standard.jar加入Lib文件夹中 将c.tld放入WEB-Info文件夹中 index.jsp <%@ page language="j ...