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.