這是騰訊機試的第二場,還是五道編程題,通過率 80%,40%,100%,沒做,0%
題目一
小Q玩遊戲,最開始有n個人參與,編號 1-n ,坐成一個圓,並從一號依次報數,最後一個同學報數之後一號同學繼續報數,在每一輪遊戲中,第m個報數的玩家會被淘汰,之後將有數個同學上場,依次坐在被淘汰同學的位置上,並順次編號,之後由替補上場的第一個同學開始報數,開始下一輪遊戲,遊戲進行k輪。
輸入:
第一行三個數字 ,n,m,k,分別表示遊戲初試人數,每一輪報數的玩家數量,遊戲的輪數。之後的一行數字將包含n個數字 Pi (1<= i <= n),代表每輪遊戲結束後替補上場玩家個數。
輸出:
輸出n行,代表每一輪遊戲被淘汰的玩家編號。
輸入:
4 3 3
2
1
3
輸出;
3
4
2
說明:一開始 1 2 3 4 淘汰3 ,加入兩名玩家,變成 1 2 5 6 4,從5開始,淘汰4,加入7 ,1 2 5 6 7,從7開始報數,淘汰2,加入三名玩家,變成 1 8 9 10 5 6 7 ,遊戲結束
題目分析:
我是做的模擬循環鏈表的操作。
代碼實現:
//80%
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int k = in.nextInt();
int input[] = new int[k];
for (int i = 0; i < k; i++)
input[i] = in.nextInt();
Node head = new Node(1);
Node head1 = head;
for (int i = 2; i <= n; i++) {
Node temp = new Node(i);
head.next = temp;
head = head.next;
}
head.next = head1;
int time = 0;
while (time < k) {
for (int i = 0; i < m - 2; i++) {
head1 = head1.next;
}
Node nownext = head1.next.next;
Node now = head1;
System.out.println(head1.next.val);
for (int i = 0; i < input[time]; i++) {
Node temp = new Node(++n);
now.next = temp;
now = now.next;
}
now.next = nownext;
head1 = head1.next;
time++;
}
}
static class Node {
int val;
Node next;
public Node(int val) {
this.val = val;
}
}
第二題
小Q在每一個期末的時候,都會對本學期學習的情況做一次全面的總結,如果這學期有n天,那麼小Q會對每一天打一個分,他對一段時間學習狀態的評分爲這段時間學習狀態最低的分數與這段時間學習狀態分數之和的乘積,小Q想知道他這個學期中學習狀態評分最高的時間段評分是多少?
輸入:
輸入第一行將包含一個數字n,代表本學期的天數,接下來一行包含n個數字Wi,代表每一天的學轉態分步。
1 <= n <= 100000;
1 <= Wi <= 100000;
輸出描述:
輸出一個數字,代表小Q在這個學期中學習狀態評分最高的時間段評分。
示例輸入:
5
7 2 4 6 5
示例輸出:
60
說明:
選擇3 - 5 天,學習狀態最低分4,和是15,乘積60.
題目分析:
我是用的暴力破解,只過了40;感覺明顯是超時了,但是因爲累加會超過int.max,所以必須至少用long。
代碼實現:
//40%
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int input[] = new int[n];
double Max = 0;
for (int i = 0; i < n; i++)
input[i] = in.nextInt();
long x[] = new long[n];
Arrays.fill(x, 0);
x[0] = input[0];
for (int i = 1; i < n; i++) {
x[i] = input[i] + x[i - 1];
}
for (int i = 1; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
Max = Math.max(Max, (double) input[findmin(input, i, j)] * (double) (x[j] - x[i - 1]));
}
}
System.out.printf("%.0f", Max);
}
public static int findmin(int[] input, int head, int wear) {
int min = 100001;
int local = 0;
for (int i = head; i <= wear; i++) {
if (input[i] < min) {
min = input[i];
local = i;
}
}
return local;
}
public static long getall(int[] input, int head, int wear) {
long val = 0;
for (int i = head; i <= wear; i++) {
val += (long) input[i];
}
return val;
}
}
第三題
排隊時候,n個顧客,編號 1-n ,每個人都有兩個屬性ai 和 bi,每個人的不滿意度 等於站在他前面的人數 * ai+站在他後面的人數 * bi。假使位置是j,既 aj * (j - 1)+ bi *(n - j)。
要求對顧客進行重新排序,使得總的不滿意度最小。
輸入描述:
第一行一個整數n,表示顧客的數量;
接下來 n 行,第 i 行包含兩個整數 ai 和 bi,用一個空格分隔;
輸出描述:
一個整數,表示總和。
示例輸入1:
2
1 1
2 2
示例輸出1:
3
示例輸入2:
3
1 3
1 1
4 1
示例輸出1:
6
題目分析:
咋一看感覺題目很複雜,但是經過公示化簡發現,每個人的不滿意度 = (ai - bi)* i + (n -i) * bi 。
只需要對(ai - bi) 進行排序即可。
代碼實現:
//AC
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int mat[][] = new int[n][2];
int[] b = new int[n];
for (int i = 0; i < n; i++) {
mat[i][0] = in.nextInt();
mat[i][1] = in.nextInt();
b[i] = mat[i][0] - mat[i][1];
}
Arrays.sort(b);
for (int i = 0; i < n / 2; i++) {
int temp = b[i];
b[i] = b[n - 1 - i];
b[n - 1 - i] = temp;
}
long result = 0;
for (int i = 0; i < n; i++) {
result += (long) b[i] * i + (long) (n - 1) * mat[i][1];
}
System.out.println(result);
}
}
後面兩個題沒有做出來,就不寫了。