1. 程式人生 > >2018年360春招筆試題

2018年360春招筆試題

奇虎360 2018年春招筆試題(3月31日)

題目一

題目描述

茉莉有一個畫板,畫板可以抽象成100行每行100個畫素點的正方形。茉莉在畫板上畫畫,一共畫了n次,每次將一個矩形塗上顏色。茉莉想知道一共有多少個畫素點被她塗過顏色。若一個畫素點被塗了k次,那麼認為有k個畫素點被塗過顏色。

輸入

每一行一個數T(T<=100),表示資料組數。
對於每組資料,第一行一個整數n,(1<=n<=100)
接下來n行,每行4個整數x1,y1,x2,y2(1<=x1<=x2<=100, 1<=y1<=y2<=100),表示兩個矩形的兩個對角所對應的畫素點的座標。

輸出

對於每組資料,輸出一行,表示茉莉一共塗了多少個畫素點。

樣例輸入

2
2
1 1 2 3
2 2 3 3
2
1 1 3 3
1 1 3 3

樣例輸出

10
18

AC 程式碼

# include<iostream>
# include<math.h>
# include<vector>
using namespace std;

int main(){

    int group;
    cin>>group;
    vector<int> result;
    while
(group--){ int n; cin>>n; int sum = 0; while(n--){ int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; sum += (abs(x2-x1)+1) * (abs(y2-y1)+1); } result.push_back(sum); } for(auto x:result) cout
<<x<<endl; // system("pause"); }

題目二

題目描述

茉莉邀請她的朋友參加週末派對,茉莉買了3種顏色的氣球,現在她要有這些氣球來裝飾餐桌,每個餐桌只用恰好3個氣球來裝飾,要求3個氣球顏色不能完全一樣,可以是2或3種顏色,茉莉想知道這些氣球最多能裝飾多少張餐桌。

輸入

第一行一個數T(T<=100),表示資料組數。
對於每組資料,第一行3個整數r,g,b,分別表示三種顏色的氣球個數(0<=r,g,b<=2*10^9)

輸出

對於每組資料,輸出一行,一個整數表示最多能裝飾的餐桌數量。

樣例輸入

2
5 4 3
2 3 3

樣例輸出

4
2

AC程式碼

# include<iostream>
# include<vector>
# include<algorithm>
using namespace std;

int main(){
    int n;
    cin>>n;
    vector<long long> result;

    while(n--){
        vector<long long> rgb(3,0);
        for(int i = 0; i<3; i++)
            cin>>rgb[i];
        sort(rgb.begin(), rgb.end());

        if( (rgb[2]>>1) < rgb[0]+rgb[1] )
            result.push_back((rgb[0] + rgb[1] + rgb[2])/3);
        else
            result.push_back(rgb[0] + rgb[1]);
    }
    for(auto x:result)
        cout<<x<<endl;
    // system("pause");
}

參考自這裡

題目三

題目描述

給你一個圖,0節點連線一個聯通塊a,1節點連線一個聯通塊b,ab僅僅由01這條邊相連。
現在我們定義奇異路徑為恰好經過0-1這條邊一次的路徑,其他邊可以經過任意次,且路徑不帶方向,1-2-3與3-2-1認為是兩條路徑。重邊也算多條路徑。
在這個圖中有無數條奇異路徑,問第k短的奇異路徑長度是多少?

輸入

輸入若干行,第一行有3個正整數n,m,k,表示有n個節點,0~n-1,有m條邊,問第k長。接下來有m行u,v表示邊,保證0-1邊只出現一次,保證a,b聯通塊只通過0-1相連。

輸出

輸出一行表示答案。

樣例輸入

5 4 10
0 1
0 2
1 3
1 4

樣例輸出

3

題目四 交易

題目描述

茉莉發起了一場交易,她將她的5個朋友聚在一起準備進行一場交易。交易開始前,大家各有b(b>0)個硬幣,交易後,每個人有ai個硬幣。由於硬幣不方便攜帶,在交易過程中可能丟失。現在茉莉想知道是否一定會丟失硬幣,或者在可能沒有丟失硬幣的情況下,交易前每個人的硬幣數b。茉莉只是組織者,不參與交易。

輸入

第一行一個數T(T<=100),表示資料組數。
對於每組資料,第一行5個整數,第i個整數ai表示交易後第i個朋友的硬幣數。(0<=ai<=100)

輸出

對於每組資料,輸出一行,若一定丟失硬幣則輸出-1,若儘可能沒有丟失,則輸出b。

樣例輸入

2
2 5 4 0 4
4 5 9 2 1

樣例輸出

3
-1

思路

看起來只要每行加起來模5等於0就沒有丟失,比如第一行加起來是15,除以5等於3,第二行加起來是21,除以5除不盡,所以輸出-1.
注意要考慮全0的情況,全0模5也是0,但是因為b>0,現在全0了,說明一定發生了丟失,所以不能輸出0,而應該輸出-1.

AC 程式碼

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int count = -1;
        while(scanner.hasNext()){
            int Z = 5;
            int S = scanner.nextInt();
            for(int j = 0;j<S;j++) {
                int[] aa = new int[Z];
                int sum = 0;
                int zero_count = 0;
                for (int i = 0; i < Z; i++) {
                    aa[i] = scanner.nextInt();
                    if(aa[i]==0)
                        zero_count += 1;
                    sum=sum+aa[i];
                }

                int ave = sum%5;
                if (ave == 0) {
                    if (zero_count==Z) {
                        System.out.println(-1);
                    }
                    else {
                        System.out.println(sum / 5); 
                    }
                } else {
                    System.out.println(-1);
                }
            }                    
        }
    }

}

題目五 賽馬

題目描述

茉莉有2n匹馬,每匹馬都有一個速度v,現在茉莉將馬分為兩個隊伍,每個隊伍各有n匹馬,兩個隊之間進行n場比賽,每場比賽兩隊各派出一匹馬參賽,每匹馬都恰好出場一次。茉莉想知道是否存在一種分配隊伍的方法使得無論怎麼安排比賽,第一個隊伍都一定能獲的全勝,兩匹馬若速度一樣,那麼速度快的獲勝,若速度一樣,則都有可能獲勝。

輸入

第一行一個數T(T<=100),表示資料組數。
對於每組資料,第一行一個整數n,(1<=n<=100)
接下來一行,2n個整數,第i個整數vi表示第i匹馬的速度(1<=vi<=1000)

輸出

對於每組資料,輸出一行,若存在一種分配方法使得第一個隊伍全勝輸出YES,否則輸出NO

樣例輸入

2
2
1 2 3 4
1
1 1

樣例輸出

YES
NO

思路

先將陣列排序,分成兩半(各n),若左邊最後一個元素小於右邊第一個元素,就能保證不管怎麼比賽都能全勝。

AC程式碼

import java.util.Arrays;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNext()){
            int S = scanner.nextInt();//第一行輸入資料組數            
            for(int j = 0;j<S;j++) {
                int Z = scanner.nextInt();//每組的個數(為n)
                int[] aa = new int[2*Z];
                int sum = 0;
                for (int i = 0; i < 2*Z; i++) {
                    aa[i] = scanner.nextInt();
                }
                Arrays.sort(aa);
                if (aa[Z-1]<aa[Z]) {
                    System.out.println("YES");
                } else {
                    System.out.println("NO");
                }
            }
        }
    }

}

玫瑰花

題目描述

有K種不同的玫瑰花,現在要擺放在N各位置,要求每種顏色的花至少出現過一次,請問有多少種不同的方案數呢?因為答案可能很大,你需要輸出它對772235取餘後的結果。

輸入

輸入只有1行,分別有兩個整數N,K(1<=N<=50000,1<=K<=30)

輸出

輸出一行表示答案

樣例輸入

3 2

樣例輸出

6

思路

先保證N中有K個位置上一定是每一種顏色的球,然後N-K位置上隨便排。
注意邊界條件,若K>N直接輸出0,若N=K輸出1,若K=0或者N=0輸出0.