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.

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值