WorkApplication是一家日企,主要办公地在东京、新加坡、上海等地。

第一题:n的全排列中有多少个排列逆序数为k

输入两个数字n,k,两个数字的范围都是[1,1000]。

输出:n的全排列中有多少个数字的逆序数等于k。

Example

输入4 1

输出3

有以下三种情况:

1 2 4 3;

2 1 3 4;

1 3 2 4

这道题一猜就是动态规划。在前n-1个数字已经排好了的情况下,将第n个数字插入进去。这第n个数字特别大,所以把它插入不同位置,会增加不同的逆序数:

f(n,k)=f(n-1,k)+f(n-1,k-1)+f(n-1,k-2)+...+f(n-1,max(k-n+1,0))

最后一项的意思是:将第n个数字插入到前n-1个数字中,最多使得逆序数增加n-1,所以第n个数字插入之前,前面n-1个数字的逆序数必须为k-(n-1)。

化简一下可以得到f(n,k)更简单的递推关系:

由f(n,k)=f(n-1,k)+f(n-1,k-1)+f(n-1,k-2)+...+f(n-1,max(k-n+1,0)),

f(n,k-1)=f(n-1,k-1)+f(n-1,k-2)+...+f(n-1,max(k-(n-1)+1,0)),

得到:

  • 当k<n时,f(n,k)=f(n-1,k-1)+f(n,k-1)
  • 当k>=n时,f(n,k)=f(n-1,k-1)+f(n,k-1)-f(n-1,k-n)

如果照着上面的思路没想通,可以打表、找规律。打表必须打表到6才能发现规律。

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int a[10];
int cnt[30];
void visit(int n){
int s = 0;
for (int i = 0; i < n; i++){
for (int j = i + 1; j < n; j++){
if (a[i]>a[j])s++;
}
}
cnt[s]++;
}
void go(int n, int ind){
if (ind == n - 1){
visit(n);
return;
}
for (int i = ind; i < n; i++){
swap(a[i], a[ind]);
go(n, ind + 1);
swap(a[i], a[ind]);
}
}
int main(){
freopen("in.txt", "r", stdin);
for (int i = 0; i < 7; i++){
memset(cnt, 0, sizeof(cnt));
for (int j = 0; j < i; j++)a[j] = j;
go(i, 0);
for (int j = 0; j < 30; j++){
printf("%d ", cnt[j]);
}
puts("");
}
return 0;
}

终于拿下了这道题:

#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
int n, k;
const int N = 1007;
int a[N][N];
int main(){
freopen("in.txt", "r", stdin);
memset(a, 0, sizeof(a));
cin >> n >> k;
for (int i = 1; i <= n; i++)a[i][0] = 1;
for (int i = 2; i <= n; i++){
for (int j = 1; j <= k; j++){
a[i][j] = a[i][j-1] + a[i-1][j];
if (j >= i){
a[i][j] -= a[i - 1][j - i];
}
a[i][j] = (a[i][j]%1000+1000)%10000;
}
}
cout << a[n][k] << endl;
return 0;
}

第二题:给定数组a[n],选取若干数字求和,能否使得被m整除

输入:第一行两个数字n和m,第二行n个数字表示数组a[n]的内容。n的取值范围[1,30],m的取值范围[1,1e6],a[n]中的数字取值范围为[1,1e9]

输出:Yes或者No,表示能否从a[n]中找到几个数字,使得它们的和为m的倍数。

解决思路:建立一个数组b[N],b[i]表示第i个数字有没有被访问过。在当前b[N]的基础上,加上一个数字a[i]得到新的b[N],就看最后能不能够到达0。

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N = 1e6 + 7;
int n, m;
int a[37];
int b[N];
int main(){
freopen("in.txt", "r", stdin);
cin >> n >> m;
bool hasAns = 0;
for (int i = 0; i < n; i++){
cin >> a[i];
a[i] %= m;
if (a[i] == 0)hasAns = 1;
}
if (hasAns)goto over;
memset(b, 0, sizeof(b));
b[0] = 1;
for (int i = 1; i < n; i++){
for (int j = 0; j <= m; j++){
if (b[j] && b[j] != i + 2){//表示j数字不是本轮产生的
int id = (j + a[i]) % m;
if (b[id] == 0||id==0){//如果id未访问过,或者id=0即将game over
b[id] = i + 2;//表示id是由i产生的
if (id == 0){
hasAns = true;
goto over;
}
}
}
}
}
over:cout << (hasAns ? "Yes" : "No") << endl;
return 0;
}

2017年WorkApplication牛客网线上机试题的更多相关文章

  1. 牛客网linux试题-错误整理-20171013

    创建对象时,对象的内存和指向对象的指针分别分配在:堆区,栈区 堆内存用来存放由new创建的对象和数组,在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在 ...

  2. 牛客网linux试题-错误整理-20170914

    Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性. 1.交互进程--由一个shell启动的进程.交互进程既可以在前台运行,也可以在后台运行. 2.批处理进程--这种进程和终端没有 ...

  3. 牛客网python试题-错误整理-20180711

    ######## >>>[3] in [1,2,3,4] False >>>3 in [1,2,3,4] True ######## x = (y = z + 1) ...

  4. 牛客网机试题-求root(N,k)

    题目描述     N<k时,root(N,k) = N,否则,root(N,k) = root(N',k).N'为N的k进制表示的各位数字之和.输入x,y,k,输出root(x^y,k)的值 ( ...

  5. [牛客网 -leetcode在线编程 -01] max-points-on-a-line -穷举

    题目及题目来源 链接:https://www.nowcoder.com/questionTerminal/bfc691e0100441cdb8ec153f32540be2 来源:牛客网 首页 > ...

  6. 牛客网华为机试题之Python解法

    牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...

  7. 算法题14 小Q歌单,牛客网,腾讯笔试题

    算法题14 小Q歌单,牛客网,腾讯笔试题 题目: 小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌 ...

  8. 算法题16 贪吃的小Q 牛客网 腾讯笔试题

    算法题16 贪吃的小Q 牛客网 腾讯笔试题 题目: 链接:https://www.nowcoder.com/questionTerminal/d732267e73ce4918b61d9e3d0ddd9 ...

  9. MySql面试题、知识汇总、牛客网SQL专题练习

    点击名字直接跳转到链接: Linux运维必会的100道MySql面试题之(一) Linux运维必会的100道MySql面试题之(二) Linux运维必会的100道MySql面试题之(三) Linux运 ...

随机推荐

  1. OpenCV学习(19) 细化算法(7)

    最后再来看一种通过形态学腐蚀和开操作得到骨架的方法.http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/ 代码非常简单: v ...

  2. [10] 圆管(Pipe)图形的生成算法

    顶点数据的生成 bool YfBuildPipeVertices ( Yreal radius, Yreal assistRadius, Yreal height, Yuint slices, YeO ...

  3. 第二章 企业项目开发--maven父子模块

    2.1.maven父子模块 在实际开发中,我们基本都会用maven父子分模块的方式进行项目的开发. 2.2.实际操作 2.2.1.手工建立一个ssmm0的文件夹,并在该文件夹中加入一个pom.xml文 ...

  4. Linux,Windows和UNIX的进程调度的分析

    摘要 : 本文以Linux ,Unix ,Windows 操作系统为例,分析其进程调度策略,以期对进程调度过程有更深层次的认识     关键词 : 进程调度 优先级 时间片轮转 实时进程 分时技术   ...

  5. 用VLC读取摄像头产生RTSP流,DSS主动取流转发(一)(二) 【转】

    http://blog.csdn.net/fm0517/article/details/38110633 http://blog.csdn.net/fm0517/article/details/381 ...

  6. iOS开发-Get请求,Post请求,同步请求和异步请求

    标题中的Get和Post是请求的两种方式,同步和异步属于实现的方法,Get方式有同步和异步两种方法,Post同理也有两种.稍微有点Web知识的,对Get和Post应该不会陌生,常说的请求处理响应,基本 ...

  7. mongo 3.0 备份和还原数据库 ,及too many positional arguments错误

    在mongo 3.0的操作 备份示例 ./mongodump -h localhost -d liongo -o ./ 错误方式: ./mongorestore -h 127.0.0.1 -d lio ...

  8. 【SpringBoot】SpringBoot性能优化

    Spring 框架给企业软件开发者提供了常见问题的通用解决方案,包括那些在未来开发中没有意识到的问题.但是,它构建的 J2EE 项目变得越来越臃肿,逐渐被 Spring Boot 所替代.Spring ...

  9. python中 对文件的读写操作 以及如何边写入 边保存flush()

    转自:https://blog.csdn.net/t8116189520/article/details/78854708 首先 python中打开文件大致常用的几类如下: 1.写入文件write # ...

  10. Cognos两种建模工具对于复杂日期维度的处理比较(上)

    众所周知,在数据仓库中,日期维度是相当重要的.对数据分析的过程中可以从不同的角度去分析,比如按照下面的日期层次去分析数据. 年-季度-月-日 年-月-日 年-周-日 本示例将利用简单的商品销售分析的d ...