【bzoj入门】3189 猜数字(数学,搜索)

Description

味味最近在玩猜数字的游戏,现在她也希望你来玩一下这个游戏。猜数字游戏的规则是这样的,告诉你一个正整数 n
(2<=n<=11),然后味味心中会想一个 n 个数字组成的数字串 (数字串最前面若干位可能是 0)。味味会随意排列 n 
位数上的数字,这样可能产生 n!个 n 位数。(n!=1×2×3×4×5×......×n,n!念作“n 阶乘”).比如味味想了一
个三位数 abc,那么一共会产生六个三位数,分别为 abc,acb,bac,bca,cab,cba然后味味会把这 n!个 n 位数求和得
到 S(若某数第一位开始有若干个 0,则求和时这些 0 舍去。如有数“0123”,则求和时加到 s 中的值是 123),她
会告诉你总和 S 减去她心中想的那个数的值,请你猜出味味心中想的那个数。

输入共包含两行。第一行一个整数 n(含义如前面所述),第二行一个正整数S,表示 n!个数的总和减去味味心中那个数的值。
2≤n≤11 ,0≤S≤10^18。如果该数第一位开始有若干个 0,则输出时这些 0 也必须输出(详见样例 3)。

思路:设已经知道答案每个位置上的数,推导公式可发现S只与数位之和与原数有关

直接搜索原数会超时,所以枚举0-9各自出现了几次,利用S与数位之和反推出原数,验证0-9出现的次数是否符合

 1 var a,b:array[0..9]of longint;
 2     pt,i,n:longint;
 3     s,q,ans,m,max:int64;
 4     p:boolean;
 5
 6 procedure dfs(k,g,t:longint);  //g shengyugeshu t shuweihe
 7 var i,tt:longint;
 8     flag:boolean;
 9     q:int64;
10
11 begin
12  if p then exit;
13
14  if k=10 then
15  begin
16   if g>0 then exit;
17   q:=t*m-s; ans:=q;
18   if q>max then exit;
19   if q<0 then exit;
20   fillchar(b,sizeof(b),0); tt:=n;
21   while q>0 do
22   begin
23    inc(b[q mod 10]);
24    q:=q div 10; dec(tt);
25   end;
26   b[0]:=b[0]+tt;
27   flag:=true;
28   for i:=0 to 9 do
29    if a[i]<>b[i] then begin flag:=false; break; end;
30   if flag then begin pt:=tt; p:=true; end;
31   exit;
32  end;
33
34  if g=0 then
35  begin
36   dfs(10,0,t);
37   exit;
38  end;
39
40  {if k=9 then
41  begin
42   a[9]:=g;
43   dfs(10,0,t+g*9);
44   a[9]:=0;
45   exit;
46  end; }
47
48  for i:=0 to g do
49  begin
50   a[k]:=i;
51   dfs(k+1,g-i,t+k*i);
52   a[k]:=0;
53   if p then exit;
54  end;
55 end;
56
57 begin
58
59  readln(n);
60  for i:=1 to n do m:=m*10+1;
61  for i:=1 to n-1 do m:=m*i;
62  readln(s);
63  for i:=1 to n do max:=max*10+9;
64  p:=false;
65  dfs(0,n,0);
66  for i:=1 to pt do write(0);
67  write(ans);
68
69 end.
时间: 2024-11-06 00:56:00

【bzoj入门】3189 猜数字(数学,搜索)的相关文章

Python基础入门-实现猜数字小游戏

今天呢,我们来通过前面学过的一些知识点来完成一个猜数字大小的游戏程序设计.那么呢,一般人写代码直接上来就干,没有分析,这样的做法是没有产出的,除非你是大牛,今天呢,我会把我学习编程的思路分享给大家,我的思路可能不是最好的,但是一定可以给你一点点的启发,来,让我们看一下这个写这个小程序该怎么去分析呢? 需求分析:用python实现一个猜数字的小游戏(场景可以自拟)这里我给出的需求是,我们还是先看一下流程图吧! 程序分析流程图: 分析思路: 1.如果设置默认值也就是结果数字,那么请输出"I"

快速排序里的学问:从猜数字开始 猜数字里的算法思想

我们先来玩一个猜数字游戏: 我心里默念一个1~64之间的数,你来猜(你只能问答案是“是”或“否”的问题).为了保证不论在什么情况下都能以尽量少的次数猜中,你应该采取什么策略呢? 很显然,二分.先是猜是不是位于1~32之间,排除掉一半可能性,然后对区间继续二分.这种策略能够保证无论数字怎么跟你捉迷藏,都能在log2n次以内猜中.用算法的术语来说就是它的下界是最好的.(算法的下界 :一个问题的下界是用来解决该问题的任意算法所需要的最小时间复杂度. ) 我们再来回顾一下这个游戏所蕴含的本质:为什么这种

猜数字里的算法思想

我们先来玩一个猜数字游戏: 我心里默念一个1~64之间的数,你来猜(你只能问答案是“是”或“否”的问题).为了保证不论在什么情况下都能以尽量少的次数猜中,你应该采取什么策略呢? 很显然,二分.先是猜是不是位于1~32之间,排除掉一半可能性,然后对区间继续二分.这种策略能够保证无论数字怎么跟你捉迷藏,都能在log2n次以内猜中.用算法的术语来说就是它的下界是最好的.(算法的下界 :一个问题的下界是用来解决该问题的任意算法所需要的最小时间复杂度. ) 我们再来回顾一下这个游戏所蕴含的本质:为什么这种

JavaSE 高级 第03节 Math类与猜数字游戏

2016-07-24 1,Math类介绍 Math.Random()  [0,1) 2,猜数字游戏 课下作业:猜数字小程序优化,增加次数限制的功能. package com.java1995; public class TestMath { public static void main(String[] args) { double d = Math.ceil(2.98); System.out.println(d); d = Math.floor(2.98); System.out.prin

python小游戏之一--------猜数字

看了一下python的入门书,拿个小游戏来练练手,其实就几行代码,也只有新手和脸皮厚的吊丝才好意思拿出来献丑 就好像张X忠一样,来,上海带,天朝海军天下无敌了 这里主要是一个random函数和 while 循环语句的使用,没了 #-*- encoding: utf-8 -*- ''' Created on 2014年5月8日 @author: Administrator ''' import random keys = random.randint(1,100)    #这个函数的作用是给一个随

猜数字游戏的提示(Master-Mind Hints,UVa340)

[本博文非博主原创,思路与题目均摘自 刘汝佳<算法竞赛与入门经典(第2版)>] Question 例题3-4 猜数字游戏的提示(Master-Mind Hints,UVa340) 实现一个经典的"猜数字"游戏.给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B). 输入包含多组数据.每组输入第一行为序列长度 n,第二行是答案序列,接下来若干行猜测序列.猜测序列全0 时该组数据结束. n=0时输入结束. Example Inp

C语言入门基础之数组——数学和编程的完美结合(图)

C语言入门基础之数组--数学和编程的完美结合(图)姐姐又来更新了,刚刚过完周末,是不是玩的很开心啊,放松后我们来学习新知识吧!现在我们要讲数组啦,编程往往和数学紧密联系着,想必在我们高中有学习过集合吧.那么在编程中我们怎么表示集合呢?刚学编程的小可爱可能学到变量时候发现,如果我需要用很多变量存储同意作用的值,需要大量的变量.现在让小姐姐给你介绍下二维数组吧,小可爱可要认真学了哦!记得给小姐姐点赞,?( ′???` )比心大家都玩抖音吧,我们每个人都有一个抖音号,我们还会关注一些小姐姐的抖音号,那

20170913自制猜数字游戏

/* 猜数字:系统随机生成一个四位数,请根据下列判断猜出来 A:数值正确,位置正确 B:数值正确,位置不正确 C:数值不正确 */ #include<stdio.h> #include<time.h> #include<stdlib.h> #pragma warning (disable:4996) #define pUCharHead unsigned char * //以数组形式返回n个无重复的随机数,范围可指定[min,max] pUCharHead GenNoR

JavaScript一个猜数字游戏

效果图: 代码: <body> <script type="text/javascript"> window.onload = newgame; //页面载入的时候就开始一个新的游戏 window.onpopstate = popState; //处理历史记录相关事件 var state,ui; //全局变量,在newgame()方法中会对其初始化 function newgame( playagin ){ //开始一个新的猜数字游戏 //初始化一个包含需要的文