求360笔试编程题答案
发布于 2017-09-20 21:06 4009 次浏览 0 赞 来自 试题交流  

三道都没写出来

32 条回复

最后一道老是超时

2017-09-20 21:07
1
#include<iostream>  
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
	int n;
	scanf_s("%d",&n);
	vector<int> num;
	int tmp;
	for (int i = 0; i < n; i++)
	{
		scanf_s("%d",&tmp);
		num.push_back(tmp);
	}
	int m;
	scanf_s("%d",&m);
	vector<int> output;
	int l;
	int r;
	int count_h = 0;
	for (int c = 0; c < m; c++)
	{
		scanf_s("%d",&l);
		scanf_s("%d", &r);
		l--;
		r--;
		count_h = 0;
		for (int i = l; i <= r - 2; i++)
		{
			if ((num[i] <= num[i]) && (num[i + 1] <= num[i + 2]))
				count_h++;
		}
		output.push_back(count_h);
	}
	for (int i = 0; i < output.size(); i++)
	{
		cout << output[i] << endl;
	}
	return 0;
}

第二道……但是还没来得及写完……时间就到了……

2017-09-20 21:09

第一题咋做 01背包吗

2017-09-20 21:10
coder_KJET32G5 回复 coder_RVTJ33QH

应该是

2017-09-20 21:11
第二题 只有80%没超时
#include<iostream>
#include<vector>
using namespace std;

int main()
{
	int n, m;
	vector<int> a;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int temp;
		cin >> temp;
		a.push_back(temp);
	}
	cin >> m;
	vector<int> b;
	int t = m;
	while (m>0)
	{
		int flag = 0;
		int l, r;
		int count = 0;
		cin >> l >> r;
		for (int i = l - 1; i < r - 2; i++)
		if (a[i] <= a[i + 1] && a[i + 1] <= a[i + 2])
		{
			if (flag == 1)
				count += 2;
			else
				count++;
			flag = 1;
			i++;
		}
		else flag = 0;
		b.push_back(count);
		count = 0;
		m--;
	}
	for (int i = 0; i < t; i++)
		cout << b[i] << endl;



	return 0;
}


2017-09-20 21:14
coder_RVTJ33QH 回复 coder_H9TEGFBZ

2 3 4 5, t=6的时候 就不能选4

2017-09-20 21:20
coder_H9TEGFBZ 回复 coder_RVTJ33QH

拉闸

2017-09-20 21:23
coder_HJQPAJ4S 回复 coder_H9TEGFBZ

你这样写跑通50%差不多了吧

2017-09-20 21:24
coder_paX6mCVc 回复 coder_H9TEGFBZ

通过了多少

2017-09-20 21:24
coder_H9TEGFBZ 回复 coder_RVTJ33QH

可以先用背包算n-1个最优, 再加最大就好了吧

2017-09-20 21:25
coder_H9TEGFBZ 回复 coder_HJQPAJ4S

厉害呀,这都能估计出来

2017-09-20 21:25
import java.io.*;
import java.util.*;

public class Main {
	public static void main(String args[]) {
		Scanner sr = new Scanner(System.in);
		int n;
		List<Integer> a = new ArrayList<Integer>();
		int m;
		List<Integer> l = new ArrayList<Integer>();
		List<Integer> r = new ArrayList<Integer>();

		String line;
		line = sr.nextLine();
		n = Integer.parseInt(line);

		String[] ss;
		line = sr.nextLine();
		ss = line.split(" ");
		for (int i = 0; i < n; ++i) {
			a.add(Integer.parseInt(ss[i]));
		}

		line = sr.nextLine();
		m = Integer.parseInt(line);

		for (int i = 0; i < m; ++i) {
			line = sr.nextLine();
			ss = line.split(" ");
			l.add(Integer.parseInt(ss[0]));
			r.add(Integer.parseInt(ss[1]));
		}
		// 数据采集完毕
		for (int i = 0; i < m; ++i) {
			System.out.println(checkPoint(a, l.get(i) - 1, r.get(i) - 1));
		}
	}

	static int checkPoint(List<Integer> a, int left, int right) {
		int sum = 0;
		for (int i = left; i <= right; i++) {
			if (i + 2 <= right) {
				if (a.get(i) <= a.get(i + 1) && a.get(i + 1) <= a.get(i + 2)) {
					++sum;
				}
			}
		}
		return sum;
	}
}

我这样写,第二题通过80%,请问剩下的20%为什么没有过?

2017-09-20 21:26
coder_HEQUAvZB 回复 coder_HJQPAJ4S

40%

2017-09-20 21:27
coder_7KC88KRD 回复 coder_FQPHD8JY

我也80%

2017-09-20 21:29
coder_W5XNRRVB 回复 coder_KJET32G5

不是,这道题包的容量是可以超过的,跟01背包问题不太一样

2017-09-20 21:30

第一题%50,。。。最后三秒才看出来哪里还有错误,,但来不及改了。。

2017-09-20 21:32
1
coder_NU4Z333W 回复 coder_FQPHD8JY

不知道你这个flag立的什么意思,估计你是在取巧,想办法在减少循环的次数。但是尴尬的是,5 1 2 3 4 3这种案例直接不行,不如你老老实实的去掉flag

2017-09-20 21:42
coder_GUCZV3BK 回复 coder_W5XNRRVB

我是排个序把最大的那个单独拿出来,剩下的01背包,再加上最大的那个。结果忘了01背包怎么写了,真是哭死我了

2017-09-20 21:55
coder_FQPHD8JY 回复 coder_NU4Z333W

这个flag确实是在取巧,只不过我这里没写完整就到时间了,实际上应该是当目前判断出当前三个数依次递增之后会将i增2,并设置flag为1,这样在下一个循环操作的时候,如果能判断出前两个数依次递增的情况下,依然可以使递增数列的数量加1.这种情况下的目的就是为了减少操作

2017-09-20 21:55
#include<bits/stdc++.h>
using namespace std;



int main(int argc,char argv){
    int n,k;
    while(cin>>n>>k){
    	vector<int> vect;
    	for(int i=0;i<n;i++){
    		int temp;
    		cin>>temp;
    		vect.push_back(temp);
		}
		sort(vect.begin(),vect.end());
		vector<int> Dp(k,0);
		int temp=k-1;
		for(int i=0;i<n-1;i++){
			for(int j=temp;j-vect[i]>=0;j--){
				Dp[j]=max(Dp[j],Dp[j-vect[i]]+vect[i]);
			}
		}
		cout<<Dp[k-1]+vect[n-1]<<endl;
	}
	return 0;
}

这是第一题


2017-09-20 22:10
1
#include<bits/stdc++.h>
using namespace std;



int main(int argc,char argv){
    int n;
    cin>>n;
    vector<int> vect;
    for(int i=0;i<n;i++){
    	int temp;
    	cin>>temp;
    	vect.push_back(temp);
	}
	vector<int> dp(n,0);
	for(int i=0;i<n-2;i++){
		if(vect[i]<=vect[i+1]&&vect[i+1]<=vect[i+2]){
			dp[i]=1;
		}
	}
	int m;
	cin>>m;
	while(m--){
		int left,right;
		cin>>left>>right;
		int count=0;
		if(right-left<2){
			cout<<"0"<<endl;
		}else{
			for(int i=left-1;i<=right-3;i++){
			    if(dp[i]==1){
			 	count++;
		        }
	    	 }
	     	cout<<count<<endl;
		}
		
	}
	
    
	return 0;
}

这是第二题

2017-09-20 22:11
1
#include <iostream>
#include <stdio.h>


int main(int argc, char** argv)
{
    int n = 0;
    long long t = 0;
    std::cin >> n >> t;
    int a[n];
    for (int i = 0; i< n; i++)
    {
        std::cin >> a[i];
    }

    // Sort a[]
    for (int it1 = 0; it1 < n; it1 ++)
    {
        for (int it2 = it1 + 1; it2 < n; it2 ++)
        {
            if (a[it1] > a[it2])
            {
                int temp = a[it1];
                a[it1] = a[it2];
                a[it2] = temp;
            }

        }
    }

    // Core
    long long  sum = 0;
    for (int j = 0; j < n; j++)
    {
        sum += a[j];
        if (sum >= t)
        {
            if (j == 0)
                break;
            else if (sum - a[j] < t)
            {
                sum -= a[j];
                sum += a[n - 1];
                break;
            }

        }

    }
    std::cout << sum;

    return 0;
}

第一题



2017-09-20 22:17
1
#include <iostream>
#include <stdio.h>
int main(int argc, char** argv)
{
    long n = 0;
    long m = 0;
    // n
    std::cin >> n;
    int a[n];
    for (int i = 0; i < n; i ++)
    {
        std::cin >> a[i];
    }
    std::cout << "\n";
    // m
    std::cin >> m;
    int r[m][2];
    for (int i = 0; i < m; i ++)
    {
        for (int j = 0; j < 2; j++)
            std::cin >> r[i][j];
    }
    //
    for (int i = 0; i < m; i ++)
    {
        std::cout << r[i][0] << " " << r[i][1] << std::endl;
    }

    // Cal
    int cnt = 0;
    for (int i = 0; i < m; i ++)
    {
        int div = r[i][1] - r[i][0];
        if (div < 2)
            cnt = 0;
        else
        {
            for (int j = r[i][0] - 1; j < r[i][1] - 2; j ++)
            {
                if (a[j] <= a[j + 1] && a[j + 1] <= a[j + 2])
                    cnt++;

            }

        }
        std::cout << cnt << std::endl;
        cnt = 0;
    }
    return 0;
}

第二题


2017-09-20 22:18
coder_MHWHZGC5 回复 coder_GUCZV3BK

咱俩真一样,我在网上搜了半天代码,最后还是没改好

2017-09-20 23:24

所以第三道题目是什么 我还没看 = =

2017-09-21 00:23
coder_8AH8V4J5 回复 coder_A847FGEZ

这答案貌似有问题…案例: 4 8 ->5 3 2 9 ,最长应为16.

2017-09-21 07:57
coder_8AH8V4J5 回复 coder_DFN3QSFH

案例: 4 8 ->5 3 2 9 ,最长应为16.

2017-09-21 08:09

第一题题解: 因为尽可能取大,所以从大到小排序.然后用DP来做.

代码如下: 

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		
		while(cin.hasNext()){
			int n = cin.nextInt();
			int t = cin.nextInt();
			
			int[] a = new int[n+1];
			for(int i=1;i<=n;i++){
				a[i] = cin.nextInt();
			}
			
			//从大到小排序-插入排序 (为了和dp保持一致,从第二位开始排序)
			int j = 0;
			for(int i=2;i<=n;i++){
				int temp = a[i];
				j = i-1;
				for(;j>0 && a[j]<temp;j--){
					a[j+1] = a[j];
				}
				a[j+1] = temp;
			}
			
			
			int[][] dp = new int[n+1][t+1];
			for(int i=1;i<=n;i++){
				for(j=1;j<=t;j++){
					if (i>=1 && j>a[i]) {
						dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-a[i]]+a[i]);
					}else if(j>0){
						dp[i][j] = Math.max(dp[i-1][j], a[i]);
					}
				}
			}
			System.out.println(dp[n][t]);
		}
	}

}


如发现问题,麻烦指出.

2017-09-21 08:41
coder_AZ96N74C 回复 coder_A847FGEZ

这个不超时吗?

2017-09-21 08:52
寒雪无痕 回复 coder_8AH8V4J5

二维数组内存会崩掉。我一维数组没做出来

2017-09-21 11:42
第三题的代码。

#include <iostream>
#include <vector>

using namespace std;

struct Edge
{
    int s;
    int e;
};

class Graph
{
private:
    vector<vector<int> > head;

public:
    Graph(int n)
    {
        for(int i=0; i<n; i++)
        {
            vector<int> vertex;
            vertex.push_back(i);
            head.push_back(vertex);
        }
    }

    int getN()
    {
        return head.size();
    }

    vector<Edge> getEdge()
    {
        vector<Edge> res;
        for(int i=0; i<head.size(); i++)
        {
            int s = head[i][0];
            for(int j=1; j<head[i].size(); j++)
            {
                int e = head[i][j];
                Edge t = Edge{s,e};
                int tag = 0;
                for(int k=0; k<res.size(); k++)
                    if((res[k].s==t.s&&res[k].e==t.e) || (res[k].s==t.e&&res[k].e==t.s))
                        tag = 1;
                if(tag == 0)
                    res.push_back(t);
            }
        }
        return res;
    }

    void addEdge(int u,int v)
    {
        head[u].push_back(v);
        head[v].push_back(u);
    }

    void delEdge(int u,int v)
    {
        for(int i=0; i<head[u].size(); i++)
            if(head[u][i] == v)
                head[u].erase(head[u].begin()+i);
        for(int i=0; i<head[v].size(); i++)
            if(head[v][i] == u)
                head[v].erase(head[v].begin()+i);
    }

    void DFS(int u,int& vc)
    {
        int n = head.size();
        int* tag = new int[n];
        for(int i=0; i<n; i++)
            tag[i] = 0;
        vc++;
        tag[u] = 1;
        for(int i=1; i<head[u].size(); i++)
            visit(head[u][i],vc,tag);

    }

    void visit(int u,int &vc,int tag[])
    {
        vc++;
        tag[u] = 1;
        for(int i=1; i<head[u].size(); i++)
            if(tag[head[u][i]] == 0)
                visit(head[u][i],vc,tag);
    }
};

int main()
{
    int n;
    cin >> n;
    Graph g = Graph(n);
    int* s = new int[n-1];   //边的两端
    int* e = new int[n-1];
    for(int i=0; i<n-1; i++)
    {
        cin >> s[i] >> e[i];
        g.addEdge(s[i],e[i]);
    }
    delete[] s;
    delete[] e;

    int res = 0;
    //挨个删除一条边
    vector<Edge> all = g.getEdge();
    for(int i=0; i<all.size(); i++)
    {
        Graph o = Graph(g.getN());   //保留原始图g,在复制图o上删除操作
        vector<Edge> all = g.getEdge();
        for(int i=0; i<all.size(); i++)
            o.addEdge(all[i].s,all[i].e);
        o.delEdge(all[i].s,all[i].e);
        int ovc = 0;    //计算删除一条边后,图两个联通分量其中一个联通分量中的顶点数
        o.DFS(0,ovc);
        if(ovc >= 2 && n-ovc >= 2)
            res = res + 8*(ovc-1)*(n-ovc-1);
    }
    cout << res << endl;
    return 0;
}


2017-09-21 13:35

反正显示已完全通过测试数据


package test;


import java.util.Arrays;

import java.util.Scanner;


public class test360 {

public static void main(String[] args) {

int n,t,sum=0;

Scanner sc = new Scanner(System.in);

while(sc.hasNext()){

n=sc.nextInt();

t=sc.nextInt();

int [] arr = new int[n];

for (int i = 0; i < n; i++) {

arr[i]=sc.nextInt();

}

Arrays.sort(arr);

for (int i = 0; i < n-1; i++) {

sum=sum+arr[i];

if(sum>t)

{

sum=sum+arr[n-1];

break;

}

}

System.out.println(sum);

}

sc.close();

}

}



2017-09-21 17:53
添加回复
回到顶部