热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

K-thstring微软2014在线笔试题

DescriptionConsiderastringsetthateachofthemconsistsof{0,1}only.Allstringsinthe

Description

Consider a string set that each of them consists of {0, 1} only. All strings in the set have the same number of 0s and 1s. 
Write a program to find and output the K-th string according to the dictionary order. If s​uch a string doesn’t exist, 
or the input is not valid, please output “Impossible”. For example, if we have two ‘0’s and two ‘1’s, 
we will have a set with 6 different strings, {0011, 0101, 0110, 1001, 1010, 1100}, and the 4th string is 1001.


Input

The first line of the input file contains a single integer t (1 ≤ t ≤ 10000), 
the number of test cases, followed by the input data for each test case.
Each test case is 3 integers separated by blank space: N, M(2 <= N + M <= 33 and N , M >= 0), 
K(1 <= K <= 1000000000). N stands for the number of ‘0’s, M stands for the number of ‘1’s, 
and K stands for the K-th of string in the set that needs to be printed as output.


Output

For each case, print exactly one line. If the string exists, please print it, otherwise print “Impossible”.


Sample In

3
2 2 2
2 2 7
4 7 47

Sample Out

0101
Impossible
01010111011

     其实说了这么多,意思很简单,就是输入N个0,M个1.然后求出由M,N个1,0组成的第K大的数。如果不存在则输出impossible.

主要是通过递归的判断当前0,1组合生成的个数与K进行比较。

  (保证在不减一个0时,生成的组合总数是大于K的,否则return。)

   若当前0的个数减一后,生成的总数要大于K,则输出0,同时0的个数减一,K,1的个数不变。

   若当前0的个数减一后,生成的总数小于K,则输出1,同时1的个数减一,0的个数不变,K=K-当前总数。

   递归调用。最后能得到结果。

import java.util.Scanner;

public class Main {

public static void print(Object[] res) {
for (Object obj : res) {
System.out.print(obj + " ");
}
System.out.println();
}
public static int getC(int m, int n){
int maxNum = 1;
int mm = Math.max(m, n);
int nn = Math.min(m, n);
for(int i = m + n; i > mm; i --){
maxNum*= i;
}
for(int i = 1; i <= nn; i ++){
maxNum/= i;
}
return maxNum;
}
public void solve(int num1, int num0, StringBuffer sb, int k){
if(num0 <0 || num1 <0)return;
if(num1 == 0 && num0 == 0) return ;
if( k == 0){
while(num1 > 0){
sb.append(1);
num1 --;
}

while(num0 > 0) {
sb.append(0);
num0--;
}
return ;
}
if(num0 > 0 && getC(num1, num0 - 1) > k){
sb.append(0);
solve(num1, num0 - 1, sb, k);
}
else if(num0 > 0 && getC(num1, num0 - 1) sb.append(1);
solve(num1 - 1, num0, sb, k - getC(num1, num0 - 1));
}
else if(num0 > 0 && getC(num1, num0 - 1) == k){
sb.append(0);
solve(num1, num0 - 1, sb, 0);
}
}
public static void main(String[] args) {
Main obj = new Main();
Scanner input = new Scanner(System.in);
int cas = input.nextInt();
int m , n, k;
StringBuffer sb = new StringBuffer("");
while ((cas -- ) > 0){
n = input.nextInt();
m = input.nextInt();
k = input.nextInt();
sb.delete(0, sb.length());
if(getC(m, n)  else {
                obj.solve(m, n, sb, k);
                System.out.println(sb.toString());
            }
}

}

}

网上分析的另一种思路:

N个0和M个1的组合问题。 下面是需代码。
解释:
dp[n][m]:n个0和m个1一共可能的组合数。
dp[n][m]递推公式: dp[n][m] = dp[n - 1][m] + dp[n][m - 1]。 表示:如果最高位是1的组合数为dp[n][m - 1], 如果最高位为0, 组合数为dp[n - 1][m].

如何生成第K个数字:
如果dp[n][m]

如果最高位是0的组合数大于等于K(dp[n][m - 1] >= K), 那么最高为一定为0。
如果最高位是0的组合数小于K, 那么最高位一定为1。 此时,因为最高位为0的组合有dp[n][m-1]个,问题变成:在N个0和(M-1)个1中需要为(K - dp[n][m-1])的数字是多少。

这是两个简单的动态规划的组合。其实dp数组中是杨辉三角,古人的智慧是无穷的!

另外,因为题目给定了M,N,K的取值范围,所以代码里面没有做合法性检查。
算法复杂度 O(M * N)

#include
 
#include
#include
#include
using  namespace  std;
 
string
calc(
int  N,  int  M,  int  K) {
   vector long  long > > dp(N + 1, vector< long  long >(M + 1));
 
   for  ( int  n = 0; n <= N; n++) {
     for  ( int  m = 0; m <= M; m++) {
       if  (n == 0 || m == 0) {
         dp[n][m] = 1;
       else  {
         dp[n][m] = dp[n - 1][m] + dp[n][m - 1];
       }
     }
   }
 
   if  (dp[N][M]
     return  "Impossible" ;
   }
   string res =  "" ;
   while  (N >= 1 && M >= 0 && K > 0) {
     if  (dp[N - 1][M] >= K) {
       res +=  "0" ;
       N--;
     else  {
       res +=  "1" ;
       K -= dp[N - 1][M];
       M--;
     }
   }
   while  (M > 0) {
     res +=  "1" ;
     M--;
   }
   return  res;
}
 
int  main() {
   // N: 0
   // M: 1
   int  k;
   cin >> k;
   int  N;
   int  M;
   int  K;
   for  ( int  i = 0; i
     cin >> N >> M >> K;
     cout < "\n" ;
   }
   return  0;
};


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 学习Java异常处理之throws之抛出并捕获异常(9)
    任务描述本关任务:在main方法之外创建任意一个方法接收给定的两个字符串,把第二个字符串的长度减1生成一个整数值,输出第一个字符串长度是 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
author-avatar
用户89e44snpn5
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有