360实习之--技术基础H卷
第一部分选择题80分,40个,每个2分五花八门,出的什么问题都有,什么概率论,KMP 卡特兰数,cmd 命令,Linux 命令,应有尽有,下面主要说一下编程题 有三个题 (20+30+30分)组队吃鸡时间限制:C/C++语言 1000MS;其他语言 3000MS内存限制:C/C++语言 65536KB;其他语言 589824KB题目描述:最近一款吃鸡类型的游戏火爆全球。在...
第一部分选择题80分,40个,每个2分
-
五花八门,出的什么问题都有,什么概率论,KMP 卡特兰数,cmd 命令,Linux 命令,应有尽有,
-
下面主要说一下编程题 有三个题 (20+30+30分)
-
组队吃鸡
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
最近一款吃鸡类型的游戏火爆全球。在组队模式下,你可以邀请自己的好友组建自己的小队,并选择是否填充(是否同意和非好友游玩),然后加入游戏。现在有A个单人队伍,B个双人队伍,C个三人队伍,D个四人队伍,并且全都同意填充,请问最多能组成多少个四人队伍。输入
第一行一个正整数T,表示数据组数。(1≤T≤100)接下来T行,每行四个非负整数,A,B,C,D。(0≤A, B, C, D≤150)
输出
共T行,每行输出一个队伍数。样例输入
4
1 2 3 4
4 3 2 1
2 2 2 1
0 2 0 1
样例输出
6
5
4
2
AC代码如下import java.util.Scanner; public class _360_1 { public static void main(String[] args) { Scanner sc =new Scanner(System.in); int T=sc.nextInt(); while(T-->0){ int sum=0; int a=sc.nextInt(); int b=sc.nextInt(); int c=sc.nextInt(); int d=sc.nextInt(); sum+=d;//4人队伍 //三人队伍找单人去借 if(c>a){ sum+=(a); a=0; }else{ sum+=c; a-=c; } if(b>=2){ sum+=(b/2); b=b%2; } if(b>0){ if(a>=2){ sum+=1; a=a-2; } } if(a>=4){ sum+=(a/4); } System.out.println(sum); } } }
2.重排序列
时间限制:C/C++语言 1000MS;其他语言 3000MS 内存限制:C/C++语言 65536KB;其他语言 589824KB 题目描述: 给定一个长度为N的序列A1到AN,现在要对序列进行M次操作,每次操作对序列的前若干项进行升序或降序排列,求经过这M次操作后得到的序列。 输入 第一行包含两个整数N和M,1≤N,M≤105。 第二行包含N个空格隔开的整数A1到AN,1≤Ai≤109。 接下来M行,每行包含两个整数t和x,0≤t≤1,1≤x≤N。若t=0,则表示对A1到Ax进行升序排列;若t=1,则表示对A1到Ax进行降序排列。操作执行顺序与输入顺序一致。 输出 输出N个空格隔开的整数,即经过M次操作后得到的序列。 样例输入 4 2 1 2 4 3 1 3 0 2 样例输出 2 4 1 3
AC代码如下
import java.util.Arrays; import java.util.Scanner; public class _360_2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int M = sc.nextInt(); int a[] = new int[N]; for (int i = 0; i < N; i++) { a[i] = sc.nextInt(); } for (int i = 0; i < M; i++) { int flag = sc.nextInt(); int index = sc.nextInt(); if (flag == 0) { Arrays.sort(a, 0, index); } else { Arrays.sort(a, 0, index); change(a, index); } } for (int i = 0; i < N; i++) { System.out.print(a[i] + " "); } } private static void change(int[] a, int index) { for (int j = 0; j < index / 2; j++) { int tmp = a[j]; a[j] = a[index - 1 - j]; a[index - 1 - j] = tmp; } } }
-
3.移动排列
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
给定一个1到N的排列A1到AN,每次可以将排列的第一个数移到排列的末尾,假设经过若干次移动后得到排列B1到BN,那么|B1-1|+|B2-2|+|B3-3|+…+|BN-N|的最小值是多少?
样例解释
经过两次移动后得到排列{1 5 2 4 3},此时|B1-1|+|B2-2|+|B3-3|+|B4-4|+|B5-5|取得最小值。
输入
第一行包含一个整数N,1≤N≤105。
第二行包含N个空格隔开的整数A1到AN。
输出
输出|B1-1|+|B2-2|+|B3-3|+...+|BN-N|的最小值。
样例输入
5
4 3 1 5 2
样例输出
6
过了55%的数据的代码如下
import java.util.Scanner;
public class _360_3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int a[]=new int[N];
for (int i = 0; i < N; i++) {
a[i]=sc.nextInt();
}
int b[]=new int[N];
for(int i=0;i<N;i++){
b[i]=i+1;
}
//最多转N次
int res = Integer.MAX_VALUE;
int p=0;
while(p++<N){
int sum=0;
for(int i=0;i<N;i++){
sum+=(Math.abs(a[(i+p)%N]-b[i]));
}
if(sum<res) res=sum;
}
System.out.println(res);
}
}
更多推荐
所有评论(0)