WordPress文章付费系统,百度seo价格,oppo手机开发者选项在哪,网站正在建设中模板单页目录
A、阶乘求和 - BigInteger
B、幸运数字 - 字符串 进制转换 暴力大法
C、数组分割 - 数学思维 乘法排列组合
D、矩形总面积 - 推导公式 找规律 #xff08;1#xff09;暴力大法好 50%
#xff08;2#xff09;正解 100%
E、蜗牛 - #xff08;我以为是模拟…目录
A、阶乘求和 - BigInteger
B、幸运数字 - 字符串 进制转换 暴力大法
C、数组分割 - 数学思维 乘法排列组合
D、矩形总面积 - 推导公式 找规律 1暴力大法好 50%
2正解 100%
E、蜗牛 - 我以为是模拟其实是线性DP
1自己写的模拟 27/100 2线性dp 100% A、阶乘求和 - BigInteger 思路 当时比赛时拿计算器算的然后辛辛苦苦也没对 看到这个数肯定很大而且只求后9位阶乘越大后面0个数会逐渐增长 首先设置BigInteger测试发现从40开始再往后的数后9位均为0所以我们只用计算1……39然后取余就ok 答案是420940313 import java.math.BigInteger;
import java.util.*;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);long res0;for(int i1;i39;i)res(resf(i))%1000000000;System.out.println(res);}public static long f(int x){BigInteger resnew BigInteger(1);for(int i1;ix;i) {resres.multiply(BigInteger.valueOf(i));resres.mod(BigInteger.valueOf(1000000000));}return res.longValue();}
}B、幸运数字 - 字符串 进制转换 暴力大法 思路 可以偷懒用Java的进制转换api 注意对16进制转换时a对应10b对应11…… 答案是215040 import java.util.*;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);int cnt0;int i1;while(true){if(ck(i,Integer.toBinaryString(i))ck(i,Integer.toOctalString(i))ck(i,Integer.toHexString(i))ck(i,String.valueOf(i)))cnt;if(cnt2023) {System.out.println(!!i);break;}i;}}public static boolean ck(int x,String s){int sum0;for (char c:s.toCharArray())if(cacf) sumc-87;else sumc-0;if(x%sum0) return true;return false;}
}C、数组分割 - 数学思维 乘法排列组合 思路 这题我就想不出来数学思维这种做这题可以拓展一些思维我每次见题第一反应都是暴力因为题目要求是任取子集也就是任意取元素不要求元素连续因此可以跳出数组遍历取值的思维 要让A0和A1均为偶数我们可以将数组中元素分为【奇数】和【偶数】两堆 则取数时在【偶数】堆可以任取因为偶数偶数偶数在【奇数】堆必须取偶数个因为奇数奇数偶数当然如果奇数堆元素个数为奇数则该数组肯定无法满足题意答案为0 假设【偶数】堆元素个数为s1【奇数】堆元素个数为s2 在偶数堆的取法方案数 ans1 在奇数堆取法方案数 ans2 则答案为 ans1×ans2 import java.util.*;public class Main {static int mod1000000007;public static void main(String[] args) {Scanner scnew Scanner(System.in);int tsc.nextInt();while(t--0){int nsc.nextInt();int even0,odd0;for(int i0;in;i){int xsc.nextInt();if(x%20) even;else odd;}if(odd%21){System.out.println(0);continue;}if(odd0) odd1; //防止出现负数int res(int)(Math.pow(2,even)*Math.pow(2,odd-1)%mod);System.out.println(res);}}
} D、矩形总面积 - 推导公式 找规律 1暴力大法好 50%
import java.util.*;public class Main {static int n10000;public static void main(String[] args) {Scanner scnew Scanner(System.in);int[][] anew int[n][n];int x1sc.nextInt(),y1 sc.nextInt();int x2sc.nextInt(),y2 sc.nextInt();int x3sc.nextInt(),y3 sc.nextInt();int x4sc.nextInt(),y4 sc.nextInt();int maxxMath.max(Math.max(x1,x2),Math.max(x3,x4));int maxyMath.max(Math.max(y1,y2),Math.max(y3,y4));for(int ix1;ix2;i)for(int jy1;jy2;j) a[i][j]1;for(int ix3;ix4;i)for(int jy3;jy4;j) a[i][j]1;long res0;for(int i0;imaxx;i)for(int j0;jmaxy;j) if(a[i][j]!0) res;System.out.println(res);}
}
2正解 100% 思路 这题我记得考场上我写了一堆if else一共写了前五题结果对了答案基本上没几个对的哈哈 大体思路求出重叠部分左下角和右上角坐标算出重叠面积两个矩形面积-重叠就是答案 由图找规律可知重叠部分 左下角坐标opx1 max{min(x1,x2)min(x3,x4)} 左下角坐标opy1 max{min(y1,y2)min(y3,y4)} 右上角坐标opx2 min{max(x1,x2)max(x3,x4)} 右上角坐标opy2 min{max(y1,y2)max(y3,y4)} 因此重叠部分面积 opx2-opx1×opy1-opy2 重叠的情况必为 opx2opx1 opy2opy1推导公式求解即可 注意用long 否则精度出现问题 import java.util.*;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);long x1sc.nextInt(),y1 sc.nextInt();long x2sc.nextInt(),y2 sc.nextInt();long x3sc.nextInt(),y3 sc.nextInt();long x4sc.nextInt(),y4 sc.nextInt();long opx1Math.max(Math.min(x1,x2),Math.min(x3,x4));long opy1Math.max(Math.min(y1,y2),Math.min(y3,y4));long opy2Math.min(Math.max(y1,y2),Math.max(y3,y4));long opx2Math.min(Math.max(x1,x2),Math.max(x3,x4));long s(x2-x1)*(y2-y1)(x3-x4)*(y3-y4);long op0;if(opx2opx1 opy2opy1) op(opx2-opx1)*(opy2-opy1);long ress-op;System.out.println(res);}
} E、蜗牛 - 我以为是模拟其实是线性DP 1自己写的模拟 27/100 思路 当时比赛这题把我折磨死记得当时也写了个模拟样例过了这次自己再写一遍模拟思路很快然后喜提27分哈哈 蓝桥杯2023年第十四届省赛真题-蜗牛 - C语言网 我写的模拟是贪心写法也就是每一次进行两个选择走平地or传送 每次选最优解已达到整体最优但是思考想想有可能是一直走平地最优尽管第一次走传送比走平地更优这样我的模拟就不全面了这题也算练练我的模拟能力 import java.util.*;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);int nsc.nextInt();int[] anew int[n];double down1.3,up0.7,walk0,cs0,res0;int cur0,x0,y0;for(int i0;in;i) a[i]sc.nextInt();resa[0];xa[0];while(true){if(xa[n-1]y0) break; //如果抵达则退出int curdoorsc.nextInt(),nextdoorsc.nextInt(); //输入传送门位置walky/downa[cur1]-a[cur]; //走平地a、从前一个传送门下来再爬来 b、如果直接就在平地则y0即从前一个杆子底部爬来if(curdoory) cs(curdoor-y)/up; //走传送门分传送门在上or在下情况else cs(y-curdoor)/down;if(curn-2) csnextdoor/down; //如果是倒数第二根杆子往最后一根杆子走则要从最后一个传送门下来xa[cur1]; //确定x y坐标并每次取最小情况if(cswalk){reswalk;y0;}else{rescs;y curn-2? 0:nextdoor;}cur;}System.out.println(String.format(%.2f,res));}
}2线性dp 100% 思路 看了眼题解的dp法跟我的模拟有异曲同工之妙我感觉dp考虑的情况更全面 dp[i][0]——蜗牛爬到第i根杆子底部的最短时间dp[i][1]——蜗牛爬到第i根杆子的传送门的最短时间 因此答案就是dp[n][0] 到第i根杆子底部有2种情况 a、从前一根杆子底部爬来【dp[i-1][0]x[i]-x[i-1]】b、从前一根传送来再从传送门下来【dp[i-1][1]b[i-1]/down】dp[i][0] Math.min( dp[i-1][0]x[i]-x[i-1] , dp[i-1][1]b[i-1]/down );到第i根杆子传送门有2种情况 a、从第i根柱子底部爬上来【dp[i][0]a[i]/up】b、从前一根传送来从这根上的一个传送门到另一个传送门【dp[i-1][1](a[i]b[i-1]? (a[i]-b[i-1])/up:(b[i-1]-a[i])/down)】dp[i][1] Math.min(dp[i][0]a[i]/up,dp[i-1][1](a[i]b[i-1]? (a[i]-b[i-1])/up:(b[i-1]-a[i])/down)); import java.util.*;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);int nsc.nextInt();double down1.3,up0.7;double[][] dpnew double[n1][2];int[] xnew int[n1],anew int[n1],bnew int[n1];for(int i1;in;i) x[i]sc.nextInt();for(int i1;in-1;i){a[i]sc.nextInt();b[i]sc.nextInt();}//dp[i][0]——蜗牛爬到第i根杆子底部的最短时间//dp[i][1]——蜗牛爬到第i根杆子的传送门的最短时间dp[1][0]x[1];dp[1][1]x[1]a[1]/up;for(int i2;in;i){dp[i][0]Math.min(dp[i-1][0]x[i]-x[i-1],dp[i-1][1]b[i-1]/down); //到第i根杆子底部有2种情况a、从前一根杆子底部爬来 b、从前一根传送来再从传送门下来dp[i][1]Math.min(dp[i][0]a[i]/up,dp[i-1][1](a[i]b[i-1]? (a[i]-b[i-1])/up:(b[i-1]-a[i])/down)); //到第i根杆子传送门有2种情况a、从第i根柱子底部爬上来 b、从前一根传送来从这根上的一个传送门到另一个传送门}System.out.println(String.format(%.2f,dp[n][0]));}
}