美团编程题AC JAVA版本

第一题找是K的倍数的最长子序列
sum[i]记录序列从0到i的和
问题转化为sum[]数组中两个元素差是k的倍数,两元素下标的最大差值
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int[] p = new int[n];
            int[] sum = new int[n + 1];
            sum[0] = 0;
            for (int i = 0; i < n; i++) {
                p[i] = sc.nextInt();
                sum[i + 1] = sum[i] + p[i];
            }
            int k = sc.nextInt();
            int res = 0;
            for (int i = 0; i < n; i++) {
                for (int j = n; j > i; j--) {
                    if (getLength(sum, i, j, k) > res) {
                        res = getLength(sum, i, j, k);
                        break;
                    }
                }
                if (res >= n - i) {
                    break;
                }
            }
            System.out.println(res);
        }
        sc.close();
    }
    static int getLength(int[] sum, int begin, int end, int k) {
        int res = 0;
        if ((sum[end] - sum[begin]) % k == 0) {
            res = end - begin;
        }
        return res;
    }

第二题改卷子
只要最大数小于等于和的二分之一就行
public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int n = sc.nextInt();
			int[] s = new int[n];
			int sum = 0;
			for (int i = 0; i < n; i++) {
				s[i] = sc.nextInt();
				sum += s[i];
			}
			Arrays.sort(s);
			if (sum >= 2 * s[n - 1]) {
				System.out.println("Yes");
			} else {
				System.out.println("No");
			}
		}
		sc.close();
	}
PS:前面的选择题有点炸

全部评论
你咋这么能呢 你咋不上天呢 你选择题做出来了么
点赞 回复 分享
发布于 2017-08-31 21:26
第一题有没有办法动态规划啊?实在想不出动态规划该怎么弄T^T
点赞 回复 分享
发布于 2017-09-01 18:40
改卷子,你写的sc.close有意义吗?好像while循环都出不来
点赞 回复 分享
发布于 2017-09-01 11:27
import java.util.Scanner; /** * Created by fishsey on 2017/8/31. */ public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); int n,temp; while (cin.hasNext()) { n = Integer.parseInt(cin.nextLine()); int maxNum=0, sums=0; while (n-- > 0) { temp = cin.nextInt(); sums += temp; maxNum = Math.max(maxNum, temp); } cin.nextLine(); if (sums >= maxNum*2) System.out.println("Yes"); else System.out.println("No"); } } } 第二题0%,楼主看看哪里有问题???
点赞 回复 分享
发布于 2017-08-31 22:48
怎么想到第一题把sum转化成元素之差的呀,为啥我想不到。。。啊,好想哭啊,,,找不到工作了T_T
点赞 回复 分享
发布于 2017-08-31 22:45
#include<iostream> using namespace std; #define MAX 100 int fun(int* a,int length,int p=5) { int i,j,k; int time,sum=0; for(i=length;i>0;i--) { time=length-i+1; for(j=0;j<time;j++) { for(k=j;k<i+j;k++) sum=sum+a[k]; if(sum%p==0) return i; sum=0; } } return -1; } void main() { int a[MAX]; int N,i=0; while(cin>>N) a[i++]=N; cout<<fun(a,i)<<endl; }
点赞 回复 分享
发布于 2017-08-31 22:22
第一题基本思想和楼主一样。。。。。 import java.util.Scanner; public class meituan { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); int[] nums = new int[N]; for(int i = 0; i < N; i++){ nums[i] = in.nextInt(); } int K  = in.nextInt(); int step = 0; long[] dp = new long[N+1]; dp[0] = 0; dp[1] = nums[0]; int index = 1; for(int i = 2; i <=N; i++){ dp[i] = dp[i-1] + nums[index++]; } int max = 0; for(int i = 0; i <=N; i++){ for(int j = N; j>=i; j--){ if((dp[j] - dp[i])%K==0){ max = Math.max(max, j-i); } } } // for(int i = N-1; i>=0; i--){ // if(dp[i]%K==0){ // System.out.println(i+1); // break; // } // } System.out.println(max); } } 楼主看看哪里有问题
点赞 回复 分享
发布于 2017-08-31 21:47
吐槽。。。。第一题居然让n^2的水过。。。
点赞 回复 分享
发布于 2017-08-31 21:37
感觉要拼一波选择
点赞 回复 分享
发布于 2017-08-31 21:37
mark 膜拜            
点赞 回复 分享
发布于 2017-08-31 21:36
二题90很尴尬
点赞 回复 分享
发布于 2017-08-31 21:26

相关推荐

点赞 评论 收藏
分享
no_work_no_life:深圳,充电宝,盲猜anker
点赞 评论 收藏
分享
评论
点赞
20
分享

创作者周榜

更多
牛客网
牛客企业服务