小易有一个长度为n序列,小易想移除掉里面的重复元素,但是小易想是对于每种元素保留最后出现的那个。小易遇到了困难,希望你来帮助他。 输入描述: 输入包括两行: 第一行为序列长度n(1 ≤ n ≤ 50) 第二行为n个数sequencei,以空格分隔
输出描述: 输出消除重复元素之后的序列,以空格分隔,行末无空格
输入例子: 9 100 100 100 99 99 99 100 100 100
输出例子: 99 100
分析
从后向前先判重后加入即可。
我的答案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include<string>
#include<algorithm>
#include<set>
#include<vector>
usingnamespacestd;
intmain(){
int n;
int a[
1002]={
0};
vector<
int>v;
set<
int>s;
cin>>n;
for(
int i=
0;i<n;i++)
cin>>a[i];
for(
int i=n
-1;i>=
0;i--){
if(s.find(a[i])==s.end()){
s.insert(a[i]);
v.push_back(a[i]);
}
}
cout<<v[v.size()
-1];
for(
int i=v.size()
-2;i>=
0;i--){
cout<<
" "<<v[i];
}
cout<<
endl;
魔力手环
题目
小易拥有一个拥有魔力的手环上面有n个数字(构成一个环),当这个魔力手环每次使用魔力的时候就会发生一种奇特的变化:每个数字会变成自己跟后面一个数字的和(最后一个数字的后面一个数字是第一个),一旦某个位置的数字大于等于100就马上对100取模(比如某个位置变为103,就会自动变为3).现在给出这个魔力手环的构成,请你计算出使用k次魔力之后魔力手环的状态。 输入描述: 输入数据包括两行: 第一行为两个整数n(2 ≤ n ≤ 50)和k(1 ≤ k ≤ 2000000000),以空格分隔 第二行为魔力手环初始的n个数,以空格分隔。范围都在0至99.
输出描述: 输出魔力手环使用k次之后的状态,以空格分隔,行末无空格。
输入例子: 3 2 1 2 3
输出例子: 8 9 7
分析
矩阵快速幂模板题。。。
我的答案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include<iostream>
#include<cstring>
usingnamespacestd;
#define MAX 52
#define MOD 100
struct Matrix{
int n,m;
int a[MAX][MAX];
voidclear(){
n=m=
0;
memset(a,
0,
sizeof a);
}
Matrix
operator +(
const Matrix &b)
const{
Matrix tmp;
tmp.n=n;
tmp.m=m;
for(
int i=
0;i<n;i++)
for(
int j=
0;j<m;j++)
tmp.a[i][j]=(a[i][j]+b.a[i][j])%MOD;
return tmp;
}
Matrix
operator(const Matrix &b)const{
Matrix tmp;
tmp.clear();
tmp.n=n;
tmp.m=b.m;
for(
int i=
0;i<n;i++)
for(
int j=
0;j<b.m;j++)
for(
int k=
0;k<m;k++)
tmp.a[i][j]=(tmp.a[i][j]+a[i][k]*b.a[k][j])%MOD;
return tmp;
}
voidprint()const{
for(
int i=
0;i<n;i++){
for(
int j=
0;j<m
-1;j++)
cout<<a[i][j]<<
" ";
cout<<a[i][m
-1]<<
endl;
}
}
Matrix
operator ^(
int k)
const{
Matrix tmp,mul;
tmp.clear();
mul.clear();
mul.n=mul.m=tmp.m=tmp.n=n;
mul=mul+(
this);
for(
int i=
0;i<n;i++)
tmp.a[i][i]=
1;
while(k>
0){
if(k&
1){
tmp=tmp*mul;
}
k>>=
1;
mul=mul*mul;
}
return tmp;
}
Matrix transpose(){
Matrix tmp;
tmp.n=m;
tmp.m=n;
for(
int i=
0;i<n;i++)
for(
int j=
0;j<m;j++)
tmp.a[j][i]=a[i][j];
return tmp;
}
};
int n,k;
intmain(){
Matrix arr;
cin>>n>>k;
arr.m=
1;
arr.n=n;
for(
int i=
0;i<n;i++)
cin>>arr.a[i][
0];
Matrix mul;
mul.clear();
mul.n=mul.m=n;
for(
int i=
0;i<n;i++){
mul.a[i][i]=
1;
mul.a[i][(i+
1)%n]=
1;
}
arr=(mul^k)*arr;
arr.transpose().print();
}
工作安排
题目
现在有n位工程师和6项工作(编号为0至5),现在给出每个人能够胜任的工作序号表(用一个字符串表示,比如:045,表示某位工程师能够胜任0号,4号,5号工作)。现在需要进行工作安排,每位工程师只能被安排到自己能够胜任的工作当中去,两位工程师不能安排到同一项工作当中去。如果两种工作安排中有一个人被安排在的工作序号不一样就被视为不同的工作安排,现在需要计算出有多少种不同工作安排计划。 输入描述: 输入数据有n+1行: 第一行为工程师人数n(1 ≤ n ≤ 6) 接下来的n行,每行一个字符串表示第i(1 ≤ i ≤ n)个人能够胜任的工作(字符串不一定等长的)
输出描述: 输出一个整数,表示有多少种不同的工作安排方案
输入例子: 6 012345 012345 012345 012345 012345 012345
输出例子: 720
分析
空间不大,直接dfs就行了。
我的答案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream>
#include<cstring>
usingnamespacestd;
bool can[
6][
6];
bool vis[
6];
int n;
intdfs(int now){
int ans=
0;
for(
int i=
0;i<
6;i++){
if(can[now][i]&&!vis[i]){
vis[i]=
true;
if(now==
0)
ans++;
else
ans+=dfs(now
-1);
vis[i]=
false;
}
}
return ans;
}
intmain(){
cin>>n;
memset(can,
0,
sizeof can);
memset(vis,
0,
sizeof vis);
for(
int i=
0;i<n;i++){
string s;
cin>>s;
for(
int j=
0;j<s.length();j++)
can[i][s[j]-
'0']=
true;
}
cout<<dfs(n
-1)<<
endl;
}
集合
题目
小易最近在数学课上学习到了集合的概念,集合有三个特征:1.确定性 2.互异性 3.无序性. 小易的老师给了小易这样一个集合: S = { p/q | w ≤ p ≤ x, y ≤ q ≤ z } 需要根据给定的w,x,y,z,求出集合中一共有多少个元素。小易才学习了集合还解决不了这个复杂的问题,需要你来帮助他。 输入描述: 输入包括一行: 一共4个整数分别是w(1 ≤ w ≤ x),x(1 ≤ x ≤ 100),y(1 ≤ y ≤ z),z(1 ≤ z ≤ 100).以空格分隔
网易2017春招笔试真题编程题集合题解双核处理题目一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。输入描述输入包括两行:第一行为整数n(1 ≤ n ≤ 50)第二行为n个