列表

详情


NC210111. 饥饿的奶牛

描述

Farmer John养了N(1 <= N <= 5,000)头奶牛,每头牛都有一个不超过32位二进制数的正整数编号。FJ希望奶牛们在进食前,能按编号从小到大的顺序排好队,但奶牛们从不听他的话。为了让奶牛们养成这个习惯,每次开饭时,FJ从奶牛中顺序地挑出一些,这些奶牛的编号必须按挑出的顺序递增。然后FJ让被挑出的奶牛们吃饭——其他奶牛就只能饿肚子了。 现在,你得到了这一次开饭前队伍中从前到后所有奶牛的编号。奶牛们想请你计算一下,按照FJ的规定,最多有多少头奶牛能吃上饭? 比如说,有11头奶牛按以下顺序排好了队(数字代表奶牛的编号) 2 5 18 3 4 7 10 9 11 8 15 对于这个队列,最多可以让7头奶牛吃上饭,她们的编号分别为2,3,4,7,10,11,15。队列2,5,3,10,15是不合法的,因为第3头奶牛的编号(3)小于她前面一头奶牛的编号(5)。

输入描述

* 第1行: 一个整数,N * 第2..?行: 除了最后一行,每一行都包含恰好20个用空格隔开的整数,依次表 示队伍中从前到后的奶牛的编号。如果N不能整除20,那么最后一 行包含的数字不到20个

输出描述

* 第1行: 输出按照FJ的规定,最多可以挑出的奶牛的数目

示例1

输入:

11
2 5 18 3 4 7 10 9 11 8 15

输出:

7

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java 解法, 执行用时: 162ms, 内存消耗: 20216K, 提交时间: 2022-02-27 11:57:44

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int [] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        System.out.println(LIS(arr,n));
    }
    public static int LIS(int [] arr,int n){
        int p;
        int len = 1;
        int [] arr1 = new int[n];
        arr1[0] = arr[0];
        for (int i = 1; i < n; i++) {
            if (arr[i]>arr1[len-1]){
                arr1[len++] = arr[i];
            }else {
                p = search(arr1,arr[i],0,len-1);
                arr1[p] = arr[i];
            }
        }
        return len;
    }

    private static int search(int[] arr1, int x, int l, int r) {
        while (l<r){
            int mid = l+(r-l)/2;
            if (arr1[mid]>=x){
                r =mid;
            }else {
                l=mid+1;
            }
        }
        return l;
    }
}

C++(clang++11) 解法, 执行用时: 36ms, 内存消耗: 432K, 提交时间: 2021-04-24 09:18:23

#include <bits/stdc++.h>
using namespace std;
int a[5001];
int f[5001];
int n;
int main(){
  cin >> n;
  for(int i=0; i<n; i++){
    f[i]=1;
    cin >> a[i];
  }
  for(int i=1; i<n; i++){
    for(int j=0; j<i; j++){
      if(a[j]<a[i])
        f[i]=max(f[j]+1, f[i]);
    }
  }
  int ans=0;
  for(int i=0; i<n; i++){
    ans=max(f[i], ans);
  }
  cout << ans;
} 

上一题