根据上排给出十个数,在其下排填出对应的十个数

根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
举一个例子,
数值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0在下排出现了6次,1在下排出现了2次,
2在下排出现了1次,3在下排出现了0次....
以此类推..

 1 #include <iostream>
 2 #include <map>
 3
 4 using namespace std;
 5
 6 class Solution {
 7 public:
 8     void solve(int pre[], int next[]) {
 9         for (int i = 0; i < 10; ++i) {
10             preCount[pre[i]]++;
11         }
12
13         recurse(pre, next, 10, 0);
14     }
15
16     void recurse(int pre[], int next[], int n, int sum) {
17         if (n <= 0) {
18             if (check(pre, next, 10)) {
19                 print(next, 10);
20             }
21             return;
22         }
23
24         if (sum > 10) return;
25
26         if (pre[n - 1] > 10 || pre[n - 1] < 0) {
27             next[n - 1] = 0;
28             recurse(pre, next, n - 1, sum);
29         } else {
30             for (int i = 0; i <= 10 / (pre[n - 1] + 1) + 1; ++i) {
31                 if (i == pre[n - 1] && preCount[pre[n - 1]] == pre[n - 1]) continue;
32                 next[n - 1] = i;
33                 recurse(pre, next, n - 1, sum + i * pre[n - 1]);
34             }
35             if (preCount[pre[n - 1]] == pre[n - 1]) {
36                 next[n - 1] = pre[n - 1];
37                 recurse(pre, next, n - 1, sum);
38             }
39         }
40     }
41
42 private:
43     map<int, int> preCount;
44
45     bool check(int pre[], int next[], int n) {
46         map<int, int> count;
47         for (int i = 0; i < n; ++i) {
48             count[next[i]]++;
49         }
50
51         for (int i = 0; i < n; ++i) {
52             if (count[pre[i]] != next[i]) return false;
53         }
54         return true;
55     }
56
57     void print(int arr[], int n) {
58         for (int i = 0; i < n; ++i) {
59             cout << arr[i] << " ";
60         }
61         cout << endl;
62     }
63 };
64
65 int main()
66 {
67     int pre[] = {10, 10, 10, 10, 10, 10, 10, 10, 10, 10};// {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; //{0, 1, 2, 2, 3, 3, 3, 4, 5, 6}; //{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
68     int next[10];
69     Solution s;
70     s.solve(pre, next);
71     return 0;
72 }

根据上排给出十个数,在其下排填出对应的十个数,布布扣,bubuko.com

时间: 2024-10-20 18:26:41

根据上排给出十个数,在其下排填出对应的十个数的相关文章

IT公司100题-6-根据上排给出十个数,在其下排填出对应的十个数

问题描述: 给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数要求下排每个数都是先前上排那十个数在下排出现的次数.上排的十个数如下:[0,1,2,3,4,5,6,7,8,9] 举一个例子,数值: 0,1,2,3,4,5,6,7,8,9分配: 6,2,1,0,0,0,1,0,0,00在下排出现了6次,1在下排出现了2次,2在下排出现了1次,3在下排出现了0次-.以此类推.. 问题分析: 它的原型跟八皇后有点类似,都是用回溯递归的方法去一次一次尝试,直到找出正确解. 具体的想法是:不断的

依次将10个数输入,要求打印出其中最大的数

#include <stdio.h>void main(){ int j=0,k=0,max=0; printf("请输入十个数:\n"); scanf("%d",&j); max=j; for(;k<=9;k++) { scanf("%d",&j); if(j>max) { max=j; } } printf("十个数中最大的数是:%d\n",max); } 依次将10个数输入,要求打

小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和

小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和的数字中的最小数. 输入描述: 输入第一行为数字个数n (n ≤ 20) 第二行为n个数xi (1

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字的最小的一个

/** * @Version 1.0.0 * 输入一个正整数数组,把数组里所有数字拼接起来排成一个数, * 打印能拼接出的所有数字的最小的一个.例如输入{3,32,321,4},则打印最小的数字是 * 321323 * * 其实就是一次排序,只是比较大小的方式与数值比较有所不同 * 这里采用冒泡排序的方式 */public class Pro33 { @MyAnswer public static void f(int array[]){ for(int i=0;i<array.length-1

三五个人十来条枪 如何走出软件作坊成为开发正规军

三五个人十来条枪 如何走出软件作坊成为开发正规军(转载) 自从发了上一篇博文,这几天收到很多朋友的来信. 大家从各个开发语言的优缺点和适用领域,一直讨论到设计模式.框架.重构.单元测试,乃至敏捷编程,最后都讨论到了软件开发过程管理,甚至都谈到了盈利模式和中国软件 的悲哀. 最后不了了之,都觉得改善中国内地现在的软件生产状况不可能. 为什么呢? 我重新把这几天大家的讨论留言翻了一遍,发现大家的软件团队都存在着这样一种普遍现象 1大部分人所在的公司,开发人员仅3-5人,多的在10人.别看就这几条枪,

输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。

转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html 昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了. 问题如下: 输入n个数组,数组长度不等,从每个数组取出一个数进行组合,求出所有的组合. 例子: int a[]={1,2}; int b[]={3,4,5}; 可能的组合:{1,3}:{1,4}:{1,5}:{2,3}:{2,4}:{2,5}: 搞了40分钟左右,不辱使命~ JAVA代码实现: import j

找出两个数组相同的元素,并且对应的个数一样

/** * 找出两个数组相同的元素,并且对应的个数一样 * @param args */ public static void getSameNumberCount(String[] a, String[] b) { Map<String, Integer> map = new HashMap<String, Integer>(); for (int i = 0; i < a.length; i++) { if (!map.containsKey(a[i])) { map.p

第二百四十六节,Bootstrap弹出框和警告框插件

Bootstrap弹出框和警告框插件 学习要点: 1.弹出框 2.警告框 本节课我们主要学习一下 Bootstrap 中的弹出框和警告框插件. 一.弹出框 弹出框即点击一个元素弹出一个包含标题和内容的容器. 基本用法 注意:必须在js结合popover()方法使用 data-toggle="popover"弹出框事件绑定,写在触发弹出框的元素里,执行弹出框事件点击弹出或隐藏(Bootstrap)title=""设置弹出框标题,写在弹出框元素里,(Bootstrap)

求序列A中每个数的左边比它小的数的个数(树状数组)

给定一个有N个正整数的序列A(N<=10^5,A[i]<=10^5),对序列中的每一个数,求出序列中它左边比它小的数的个数. 思路:树状数组的经典应用(裸题) 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 5 using namespace std ; 6 7 const int N = 100010 ; 8 9 int c[N] ; 10 11 int lowbit(