摄影行业网站,wordpress关闭评论,discuz应用,南阳在线网站制作(第一个填空太简单#xff0c;就不写了,根本不用代码#xff0c;直接excel计算)
目录
蓝桥杯第二个填空#xff0c;类斐波那契循环数
蓝桥杯JAVA.b组第三题 -分布式队列(模拟)
食堂(蓝桥杯D题) 编辑
星际旅行(Floyd佛洛依德) 其余的有点变态#xff0c;感觉学了好像…(第一个填空太简单就不写了,根本不用代码直接excel计算)
目录
蓝桥杯第二个填空类斐波那契循环数
蓝桥杯JAVA.b组第三题 -分布式队列(模拟)
食堂(蓝桥杯D题) 编辑
星际旅行(Floyd佛洛依德) 其余的有点变态感觉学了好像也没用还是算了 蓝桥杯第二个填空类斐波那契循环数 首先难点就是这个题目需要读懂当初我就是没读明白才没写出来我一般都是写力扣的题力扣的题更加偏向于方法或者说是业务上的而蓝桥杯更偏向那种数学的类型 这个难点是弄懂那个求和符号我好久没学都忘了 比如说9999999这个是7位数然后假如我们写第10位就是 public static void main(String[]args) {for(int i10000000;i0;i--){char[] a(i).toCharArray();int sum0;int[]bnew int[a.length];for(int j0;ja.length;j){b[j]Integer.valueOf(a[j]);sumb[j];}while(true) {if (sum i) {System.out.println(sum);return;} else if (sum i) {break;}int tmpsum;sum 2 * sum - b[0];for (int j 0; j a.length - 1; j) {b[j] b[j 1];}//更新最后一个值b[a.length - 1] tmp;//处理前一个值进行迭代处理}} 蓝桥杯JAVA.b组第三题 -分布式队列(模拟)
这个代码是我觉得看的最清晰的一个而且他的想法很简洁适合我这种菜鸡
这个题难度就是你选择的问题你假如选择不正好的策略会麻烦好多。像是我开始想用数组因为下标不好表示开始我也是寻思用集合但是困在一些问题上选择自己更擅长的但是确没想到更麻烦而且没解出来) public static void main(String[]args) {Scanner sc new Scanner(System.in);int n sc.nextInt();//使用一个类似二维数组ListListInteger numsnew ArrayList();for(int i0;in;i){//这个数组有添加n个队列nums.add(new ArrayList());}while (sc.hasNext()) {//通过command判断输入的例子。String command sc.next();if (command.equals(add)) {int numsc.nextInt();//假如此时需要添加元素则需要在第一个集合里面添加元素nums.get(0).add(num);} else if (command.equals(sync)) {//获取到我们需要添加到哪号队列int seq sc.nextInt();//nums获取到这个队列假如里面的个数小于一号队列个数if(nums.get(seq).size()nums.get(0).size()) {//nums的seq队列添加队列0里面的获取的是队列2的长度队列2的下标永远是没到这个位置所以需要到2号这个下标nums.get(seq).add(nums.get(0).get(nums.get(seq).size()));}} else {//找到n个队列中到元素个数int min_count Integer.MAX_VALUE;for (int i 0; i n; i) {//获取到每个元素然后min代表最后的元素模拟(很牛逼的思路第二个)if (nums.get(i).size() min_count) min_count nums.get(i).size();}System.out.println(min_count);}}} 食堂(蓝桥杯D题) 这个题看着就恶心的模拟但是假如说暴力穷举肯定也是可以但是缺点是什么呢 缺点就是她这个你很容易有想不到的情况而且这些情况加一起的顺序性就很恶心 所以相比较之下还是下面这个方法更好 这道题我相信大部分人的思路肯定是从食堂桌子出发那么我们需要做的就是分解他条件的思考 首先4个桌子6个桌子我们肯定是第一时间先凑出来6人桌子2个三人桌肯定是最优先然后我们考虑的是什么24肯定6个222肯定6个但是假如换个思路假如已经坐了两个人我们是不是可以默认这个食堂多了一个四人桌子如果这么考虑我们很多情况都可以合并到一起只需要考虑四人桌子就行 四人桌子肯定还是优先4人和2个2人假如这些都完事了说明什么情况呢 存在六人桌子存在4人和3人但是不存在2人 存在4人桌子可能存在两个人可能存在三个人(有人可能问我们在开始就判断了是否可能出现2个人结果是一定不会有两个人但是假如没有六人桌子的情况下是否有可能出现2个人呢也是有可能的) 这些情况综合起来只有一句话就是一个桌子只能坐一个寝室你2人3人4人都好 我只要把最后的桌子都放到一起然后4人就给一个桌子(不管它是4人还是6人反正一定能装下 这里补充:可能你觉得不靠谱去试试假如5个人咋整5个人的前提是有2个人2个人要么我存在6人桌子被分开要不存在六个人的桌子那样坐不了五个人所以还是一个桌子一个寝室) import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[]args) {Scanner scan new Scanner(System.in);int qscan.nextInt();int[][]anew int[q][5];//选择的角度应该是从桌子入手//a[0][0]:两人寝室,[1]三人寝室,[2]四人寝室 [3]四个人桌子[4]六人桌子//更优秀的思想把六个人的桌子转化为四个人的桌子for(int i0;iq;i){for(int j0;j5;j){a[i][j]scan.nextInt();}int count0;//a[0][0]:两人寝室,[1]三人寝室,[2]四人寝室 [3]四个人桌子[4]六人桌子//假如有六人桌子优先分配2个三人while(a[i][4]0a[i][1]2){a[i][1]-2;a[i][4]--;count6;}//假如有六人桌子优先分配1个两人这样就相当于多了一个四个人的桌子while(a[i][4]0a[i][0]0){a[i][4]--;a[i][0]--;a[i][3];//相当于多了一个四人桌子count2;}//假如四人桌子优先分配四个人的while(a[i][3]0a[i][2]0){a[i][2]--;a[i][3]--;count4;}//四人寝室没了四人桌子优先给2个2人寝室while(a[i][3]0a[i][0]2){//2人寝室则剪去2个a[i][0]-2;a[i][3]--;count4;}//到了最后其实就都不是凑整数的情况换句话说咋吗都坐不满6人能转化的都转化了转化不了的也同化成4个人//因为假如你想5个人是32,相当于四人寝室住了3个人换句话最后四人桌子还是六人桌子已经没有区别了int numa[i][4]a[i][3];//以下的情况都是满足不了的while(num0a[i][2]0){num--;a[i][2]--;count4;}while(num0a[i][1]0){num--;a[i][1]--;count3;}while(num0a[i][0]0){num--;a[i][0]--;count2;}System.out.println(count);}scan.close();}}
最优分组(数学题) 星际旅行(Floyd佛洛依德) static int n,m,q;static int[][] con;public static void main(String[] args) {Scanner zhnew Scanner(System.in);nzh.nextInt();mzh.nextInt();qzh.nextInt();connew int[n1][n1];//我们选择从[1-n]闭区间不考虑0
//处理边界值比如0x之类的for(int i1;in;i)Arrays.fill(con[i], 3010);for(int i1;in;i)con[i][i]0;for(int i0;im;i) {int azh.nextInt();int bzh.nextInt();con[a][b]1;con[b][a]1;}//算法核心核心问题也在这里k在最外面和k在循环的最里面有什么区别for(int k1;kn;k) {for(int i1;in;i) {for(int j1;jn;j) {
//这个的核心是类似于动态规划从con[i][j],con[i][k][k][j],从i到j需要i通过k到j
//相当于算从i到j位置的最短路径con[i][j]Math.min(con[i][j], con[i][k]con[k][j]);}}}int ans0;for(int i0;iq;i) {int xzh.nextInt();int yzh.nextInt();int count0;
//我们从x点出发到达j点花费步骤假如小于y就说明可以到达,count;for(int j1;jn;j)if(con[x][j]y)count;//System.out.println(count);anscount;}System.out.printf(%.2f, (double)ans/q);} 其余的有点变态感觉学了好像也没用还是算了