ccf 20210902

暴力法(70)java实现:

import java.util.Scanner;

/**
 * @author liuxun
 * @create 2022-02-05 21:21
 * @description
 */
public class r2021_09_2 {
    public static void main(String[] args){
            int n;
            Scanner sc = new Scanner(System.in);
            n = sc.nextInt();
            int[] num = new int[500000];
            for (int i = 0; i < n; i++) {
                num[i] = sc.nextInt();
            }

            int maxSum = 0;
           for (int i =0; i<=10000;i++){
               boolean flag = true;
               int sum =0;
               for(int j =0;j<n;j++){
                   if(num[j]>i&&flag){
                       sum++;
                       flag=false;
                   }
                   if(num[j]<=i){
                       flag =true;
                   }

               }
               if(sum>maxSum){
                   maxSum = sum;
               }
           }
        System.out.println(maxSum);
    }
}

索引法 c++实现:

#include<iostream>//42min + 30min
#include<vector>
using namespace std;
 
int const N = 5*100000; 
int a[N];//存储每一个具体数据 
int range[N];//存储为抽象的 0 1      0 代表 < p  1 代表 >= p  
vector<int>v[10000+1];//每一个v[i]存储对应 所有 i 的位置 
 
int main(){
	int n;
	int last = 1;//last为上一次划分数,p = 0 时,last = 1  
	cin >> n;
	int maxa = 0;
	for(int i = 1;i <= n;i++){
		cin >> a[i];
		v[a[i]].push_back(i);
		if(a[i] > maxa){
			maxa = a[i];
		}
		range[i] = 1;
	}
	range[0] = 0;
	range[n + 1] = 0;	
	
	int max = 0;
	for(int p = 0;p <= maxa;p++){
		if(v[p].size() != 0){//将小于p的数在range数组中标记为0,这里相当于将条件改成了<=p 的改为 1,题目不追究p影响不大
			int t = last;
			for(int i = 0;i < v[p].size();i++){
				range[ v[p][i] ]= 0;//将v[p]中的所有都置为 0 
				if(range[ v[p][i] - 1] == 0 && range[ v[p][i] + 1] == 0){
					t--;
				}else if(range[ v[p][i] - 1] == 1 && range[ v[p][i] + 1] == 1){
					t++;
				}
			}
			if(max < last)	max = last;
			if(max < t)		max = t;
			last = t;
		}
	}	
	cout<<max;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值