牛客笔试,牛客.四个选项(dfs巨难)牛客.接雨水动态规划单调栈解法牛客.栈和排序牛客.加减

本文主要是介绍牛客笔试,牛客.四个选项(dfs巨难)牛客.接雨水动态规划单调栈解法牛客.栈和排序牛客.加减,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

牛客.四个选项(dfs巨难)

牛客.接雨水

动态规划

单调栈解法

牛客.栈和排序

牛客.加减


牛客.四个选项(dfs巨难)

 

刚开始我是想着用数学,Cxx去解决,但是他的还有其余条件,就没有办法解决,所以就枚举 ,递归的数据量不大时候,是推荐使用的

import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {static int []a;static int[]path=new int[13];//记录当前路径填写了哪些选项static int sum;static boolean[][]same=new boolean[13][13];public static void  dfs(int pos){if(pos>12){
//12个填写满是1种,我们需要写完12种sum++;return ;}for(int i=1;i<=4;i++){if(a[i]==0){//剪枝,看看有没有剩余的次数
continue;}if(!isSame(pos,i))continue; //判断是否需要相同的题目,填写了相同的选项//在pos位置填写了i选项,当我们path[pos]如果我们下次循环,会覆盖掉这次的经历。path[pos]=i;a[i]--;dfs(pos+1);a[i]++;}} //pos位置,填写cur的时候static boolean isSame(int pos,int cur){for(int i=1;i<pos;i++){//pos和i必须要是相同的,path和cur要填的不同是不合法的if(same[pos][i]==true&&path[i]!=cur){return false;}}//当前位置填写cur合法return true;}public static void main(String[] args) {Scanner in = new Scanner(System.in);a=new int[6];for(int i=1;i<=5;i++){a[i]=in.nextInt();}while(a[5]!=0){int x=in.nextInt();int y=in.nextInt();same[x][y]=same[y][x]=true;a[5]--;}dfs(1); System.out.println(sum);}
}

牛客.接雨水

动态规划

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** max water* @param arr int整型一维数组 the array* @return long长整型*/public long maxWater (int[] arr) {int n=arr.length;long sum=0;int[]left=new int[n];int[]right=new int[n];left[0]=arr[0];//0-ifor(int i=1;i<n;i++){left[i]=Math.max(left[i-1],arr[i]);}//预处理右侧 i到 nright[n-1]=arr[n-1];for(int i=n-2;i>=0;i--){//后面位置的最大值,和当前位置的最大值right[i]=Math.max(right[i+1],arr[i]);}for(int i=1;i<n-1;i++){sum+=Math.min(left[i],right[i])-arr[i];}return sum;}
}

单调栈解法

class Solution {public int trap(int[] height) {Stack<Integer> stack = new Stack<>();int res = 0;// 遍历每个柱体for (int i = 0; i < height.length; i++) {while (!stack.isEmpty() && height[stack.peek()] < height[i]) {int mid = stack.pop();// 如果栈顶元素一直相等,那么全都pop出去,只留第一个。while (!stack.isEmpty() && height[stack.peek()] == height[mid]) {stack.pop();}if (!stack.isEmpty()) {// stack.peek()是此次接住的雨水的左边界的位置,右边界是当前的柱体,即i。// Math.min(height[stack.peek()], height[i]) 是左右柱子高度的min,减去height[mid]就是雨水的高度。// i - stack.peek() - 1 是雨水的宽度。res += (Math.min(height[stack.peek()], height[i]) - height[mid]) * (i - stack.peek() - 1);}}stack.push(i);}return res;}
}

牛客.栈和排序

好想不好写,蛮考验代码功力的

然后有一些,还在栈里面,就等栈空不空,接着搞

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 栈排序* @param a int整型一维数组 描述入栈顺序* @return int整型一维数组*/public int[] solve (int[] a) {int n = a.length;Stack<Integer>stack = new Stack<>();ArrayList<Integer>ret = new  ArrayList<>();int count = n;int []hash = new int[n + 1];for (int i = 0; i < n; i++) {stack.add(a[i]);hash[a[i]]++;if (a[i] == count && (stack.isEmpty() || stack.peek() < a[i])) {stack.pop();ret.add(a[i]);hash[count]++;count--;}while (hash[count] != 0) {count--;}while (!stack.isEmpty() && stack.peek() > count) {ret.add(stack.pop());}}while (!stack.isEmpty()) {ret.add(stack.pop());}int []p = new int[n];for (int i = 0; i < n; i++) {p[i] = ret.get(i);}return p;}}

牛客.加减

如何求一个区间的最小代价

加入选择a2与a3比较

a3的花费是 整段+a2——a4

a2的花费是 整段+a2——a4+a3-a2所以最中间的点有优势

import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int n = in.nextInt();long k = in.nextLong();long []a = new long[n+1];long []sum = new long[n+1];int count=0;for (int i = 1; i <= n; i++) {a[i] = in.nextLong();}Arrays.sort(a);for (int i = 1; i <= n; i++) {sum[i]=sum[i-1]+a[i];}long cost=0;int left = 1;int right = 1; while(right<=n){      int mid=(left+right)/2;    cost=(mid-left)*a[mid]-(sum[mid-1]-sum[left-1])+(sum[right]-sum[mid])-(right-mid)*a[mid];     while(cost>k){left++;mid=(left+right)/2; cost=(mid-left)*a[mid]-(sum[mid-1]-sum[left-1])+(sum[right]-sum[mid])-(right-mid)*a[mid];     }count=Math.max(count,right-left+1);right++;}System.out.print(count);}}

这篇关于牛客笔试,牛客.四个选项(dfs巨难)牛客.接雨水动态规划单调栈解法牛客.栈和排序牛客.加减的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135967

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl