文章目录

  • 1. 购物单(结果填空 - 5分)
  • 2. 纸牌三角形(结果填空 - 11分)
  • 3. 承重计算(结果填空 - 13分)
  • 4. 魔方状态(结果填空 - 17分)
  • 5. 取数位(代码填空 - 7分)
  • 6. 最大公共子串(代码填空 - 9分)
  • 7. 日期问题(程序设计 - 19分)
  • 8. 包子凑数(程序设计 - 21分)
  • 9. 分巧克力(程序设计 - 23分)
  • 10. k倍区间(程序设计 - 25分)

题目来源:一叶之修


1. 购物单(结果填空 - 5分)

购物单

小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。

这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。
小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。
现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。

取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。
你的任务是计算出,小明最少需要取多少现金。
以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。

/*
****     180.90       88折
****      10.25       65折
****      56.14        9折
****     104.65        9折
****     100.30       88折
****     297.15        半价
****      26.75       65折
****     130.62        半价
****     240.28       58折
****     270.62        8折
****     115.87       88折
****     247.34       95折
****      73.21        9折
****     101.00        半价
****      79.54        半价
****     278.44        7折
****     199.26        半价
****      12.97        9折
****     166.30       78折
****     125.50       58折
****      84.98        9折
****     113.35       68折
****     166.57        半价
****      42.56        9折
****      81.90       95折
****     131.78        8折
****     255.89       78折
****     109.17        9折
****     146.69       68折
****     139.33       65折
****     141.16       78折
****     154.74        8折
****      59.42        8折
****      85.44       68折
****     293.70       88折
****     261.79       65折
****      11.30       88折
****     268.27       58折
****     128.29       88折
****     251.03        8折
****     208.39       75折
****     128.88       75折
****      62.06        9折
****     225.87       75折
****      12.89       75折
****      34.28       75折
****      62.16       58折
****     129.12        半价
****     218.37        半价
****     289.69        8折
*/

需要说明的是,88折指的是按标价的88%计算,而8折是按80%计算,余者类推。特别地,半价是按50%计算。

请提交小明要从取款机上提取的金额,单位是元。
答案是一个整数,类似4300的样子,结尾必然是00,不要填写任何多余的内容。
特别提醒:不许携带计算器入场,也不能打开手机。

excel —> 数据直接复制到excel中此时数据在一列,点击上方“数据” — “分列” ,用分割符号可分成三列。分割后将折扣转为能直接计算的数字,使用excel的函数计算出结果。

答案:5200


2. 纸牌三角形(结果填空 - 11分)

纸牌三角形

A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。要求每个边的和相等。
下面就是一种排法
A
9 6
4 8
3 7 5 2
这样的排法可能会有很多。
如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?

请你计算并提交该数字。
注意:需要提交的是一个整数,不要提交任何多余内容。

/*1. 暴力破解将三角形看作下面这样,用九个for循环加if判断。ab cd e f g h i2. 全排列
*/
int ans = 0;
for(int a=1; a<=9; a++) {for(int b=1; b<=9; b++) {for(int c=1; c<=9; c++) {for(int d=1; d<=9; d++) {for(int e=1; e<=9; e++) {for(int f=1; f<=9; f++) {for(int g=1; g<=9; g++) {for(int h=1; h<=9; h++) {for(int i=1; i<=9; i++) {if(a!=b && a!=c && a!=d && a!=e && a!=f && a!=g && a!=h && a!=i &&b!=c && b!=d && b!=e && b!=f && b!=g && b!=h && b!=i &&c!=d && c!=e && c!=f && c!=g && c!=h && c!=i &&d!=e && d!=f && d!=g && d!=h && d!=i &&e!=f && e!=g && e!=h && e!=i && f!=g && f!=h && f!=i &&g!=h && g!=i &&h!=i) {if((a+b+d+f)==(a+c+e+i)&&(a+b+d+f)==(f+g+h+i)&&(a+c+e+i)==(f+g+h+i)) {ans++;}}}}}}}}}}
}
System.out.println(ans/6);// 全排列
public class Main {static int[] a = {1,2,3,4,5,6,7,8,9};static int ans = 0;public static void main(String[] args) {Scanner sc = new Scanner(System.in);f(0);System.out.println(ans/6);}static void f(int k) {if(k == 9) {int x1 = a[0]+a[1]+a[3]+a[5];int x2 = a[0]+a[2]+a[4]+a[8];int x3 = a[5]+a[6]+a[7]+a[8];if(x1==x2 && x2 == x3) {ans++;}}// 全排列for(int i = k; i < 9; i++) {int t = a[k];a[k] = a[i];a[i] = t;f(k + 1);t = a[k];a[k] = a[i];a[i] = t;}}}

CSDN — MsStrbig: 全排列递归算法

答案:144


3. 承重计算(结果填空 - 13分)

承重计算

X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。
每块金属原料的外形、尺寸完全一致,但重量不同。
金属材料被严格地堆放成金字塔形。

/*                           7 5 8 7 8 8 9 2 7 2 8 1 4 9 1 8 1 8 8 4 1 7 9 6 1 4 5 4 5 6 5 5 6 9 5 6 5 5 4 7 9 3 5 5 1 7 5 7 9 7 4 7 3 3 1 4 6 4 5 5 8 8 3 2 4 3 1 1 3 3 1 6 6 5 5 4 4 2 9 9 9 2 1 9 1 9 2 9 5 7 9 4 3 3 7 7 9 3 6 1 3 8 8 3 7 3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3 2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8 7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9 7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6 5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
*/

其中的数字代表金属块的重量(计量单位较大)。
最下一层的X代表30台极高精度的电子秤。

假设每块原料的重量都十分精确地平均落在下方的两个金属块上,最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。电子秤的计量单位很小,所以显示的数字很大。

工作人员发现,其中读数最小的电子秤的示数为:2086458231

请你推算出:读数最大的电子秤的示数为多少?
注意:需要提交的是一个整数,不要填写任何多余的内容。

上层的数二分后累加到下层的数上,从最后一层中获取最小值与最大值。
tips:
1.题目中的示数(2086458231)不是能直接累加得到的。这是由于计量单位不同,假设计量单位差2的30次方。2.计算前将所有数字先统一乘以2的30次方。在计算前乘2的30次方可避免小数字在除2时精度丢失。3.使用 long型。

/*1. 输入数据存入二维数组2. 处理所有数字 ×2^303. a[i][j]/2 后加入 a[i+1][j] 和 a[i+1][j+1]4. 循环 2~n-1行5. 对a[n-1]行进行排序,查看最小值与题中示数关系(因为计量单位是假定的)6. 输出最大值
*/
import java.util.Arrays;
import java.util.Scanner;public class Main {static long[][] arr = new long[30][30];public static void main(String[] args) {Scanner sc = new Scanner(System.in);// factor 2^30long factor = 1;for(int i=0; i<30; i++) {factor<<=1;}// 输入数据放入二维数组for(int i=0; i<29; i++) {for(int j=0; j<=i; j++) {long a = sc.nextLong();arr[i][j] = a*factor;}}// 二分后加到下一层for(int i=0; i<29; i++) {for(int j=0; j<=i; j++) {long half = arr[i][j]/2;arr[i+1][j] += half;arr[i+1][j+1] +=half;}}Arrays.sort(arr[29]);// (arr[29][0]/2086458231): 得到的最小值与题中数字是几倍关系System.out.println(arr[29][29]/(arr[29][0]/2086458231));}
}

答案:72665192664


4. 魔方状态(结果填空 - 17分)

魔方状态

二阶魔方就是只有2层的魔方,只由8个小块组成。
小明很淘气,他只喜欢3种颜色,所有把家里的二阶魔方重新涂了颜色,如下:

前面:橙色
右面:绿色
上面:黄色
左面:绿色
下面:橙色
后面:黄色

请你计算一下,这样的魔方被打乱后,一共有多少种不同的状态。

如果两个状态经过魔方的整体旋转后,各个面的颜色都一致,则认为是同一状态。

请提交表示状态数的整数,不要填写任何多余内容或说明文字。

考察空间想象力、需要细心耐心编写代码。
代码量大,很繁杂。

/*1. 想办法把一个魔方的状态表示出来。二阶魔方有八个小正方形块,将八个小正方形块编号为 0~7。每个小正方形有六个面,将六个面也编号,六个面有三个在魔方上是看不见的。一个小正方形的状态表示为:“oyxxgy” 【o:orange/y:yellow/g:green/x:看不见的】一个二维数组就可以表示魔方的状态了。2. 三种方式的旋转就可以到达魔方所有的状态。前面顺时针转,右面顺时针转、上面顺时针转状态改变会导致块位置变化和每个块的面位置变化3. 去重
*/
import java.util.HashSet;
import java.util.Set;public class Main {static char[][] start = {"oybbgb".toCharArray(),"oygbbb".toCharArray(),"bygbby".toCharArray(),"bybbgy".toCharArray(),"obbogb".toCharArray(),"obgobb".toCharArray(),"bbgoby".toCharArray(),"bbbogy".toCharArray()};static char[][][] q = new char[2000000][8][6];static Set<String> all_state = new HashSet<String>();static int  front, tail;static String to_string(char[][] a) {String ans = "";for (int i = 0; i < 8; ++i) {ans += new String(a[i]);}return ans;}private static void swap(char[] a, int i, int j) {char t = a[i];a[i] = a[j];a[j] = t;}private static void swap(char[][] a, int i, int j) {char[] t = a[i];a[i] = a[j];a[j] = t;}//上层块的旋转,面的相对位置调换static void ucell(char[] a) {swap(a, 0, 2);swap(a, 2, 5);swap(a, 5, 4);} //上层顺时针旋转static void u(char[][] s) {ucell(s[0]);ucell(s[1]);ucell(s[2]);ucell(s[3]);//块的位置变化swap(s, 1, 0);swap(s, 2, 1);swap(s, 3, 2);}//右层块的旋转,面的相对位置调换static void rcell(char[] a) {swap(a, 1, 0);swap(a, 0, 3);swap(a, 3, 5);}//右层顺时针转static void r(char[][] s){rcell(s[1]);rcell(s[2]);rcell(s[6]);rcell(s[5]);//块的位置变化swap(s, 2, 1);swap(s, 5, 1);swap(s, 6, 5);}//前面块的旋转,面的相对位置调换static void fcell(char[] a) {swap(a, 2, 1);swap(a, 1, 4);swap(a, 4, 3);}//前面一层 顺时针转static void f(char[][] s){fcell(s[0]);fcell(s[1]);fcell(s[4]);fcell(s[5]);//块的位置变化swap(s, 1, 5);swap(s, 0, 1);swap(s, 4, 0);}static void uwhole(char[][] s)//整个魔方从顶部看 顺时针转 用于判重{u(s);// 上层旋转
// 下层旋转ucell(s[4]);ucell(s[5]);ucell(s[6]);ucell(s[7]);
// 完成自旋后,块的位置变动swap(s, 5, 4);swap(s, 6, 5);swap(s, 7, 6);}static void fwhole(char[][] s)//整个魔方从前面看 顺时针转 用于判重{f(s);fcell(s[2]);fcell(s[6]);fcell(s[7]);fcell(s[3]);swap(s, 2, 6);swap(s, 3, 2);swap(s, 7, 3);}static void rwhole(char[][] s)//整个魔方从右边看 顺时针转 用于判重{r(s);rcell(s[0]);rcell(s[3]);rcell(s[4]);rcell(s[7]);swap(s, 3, 7);swap(s, 0, 3);swap(s, 4, 0);}static boolean try_insert(char[][] s) {char[][] k = new char[8][6];memcpy(k, s);for (int i = 0; i < 4; i++) {fwhole(k);for (int j = 0; j < 4; j++) {uwhole(k);for (int q = 0; q < 4; q++) {rwhole(k);if (all_state.contains(to_string(k))) {return false;}}}}all_state.add(to_string(k));return true;}private static void memcpy(char[][] k, char[][] s) {for (int i = 0; i < 8; i++) {for (int j = 0; j < 6; j++) {k[i][j] = s[i][j];}}}static void solve() {front = 0;tail = 1;all_state.add(to_string(start));memcpy(q[front], start);//填充q[0],相当于第一个状态入队列while (front < tail) {/*将其所有变形,尝试加入set中*/memcpy(q[tail], q[front]);//拷贝到tailu(q[tail]);//上层顺时针旋转if (try_insert(q[tail])) {tail++;//扩展队列}memcpy(q[tail], q[front]);//拷贝到tailr(q[tail]);//右层顺时针旋转if (try_insert(q[tail])) {tail++;//扩展队列}memcpy(q[tail], q[front]);//拷贝到tailf(q[tail]);//前顺时针旋转if (try_insert(q[tail])) {tail++;//扩展队列}front++;//弹出队首
//        cout << front << " " << tail << endl;}System.out.println(front);}public static void main(String[] args) {solve();}
}

答案:229878


5. 取数位(代码填空 - 7分)

取数位

求1个整数的第k位数字有很多种方法。
以下的方法就是一种。

对于题目中的测试数据,应该打印5。
请仔细分析源码,并补充划线部分所缺少的代码。
注意:只提交缺失的代码,不要填写任何已有内容或说明性的文字。

public class Main
{static int len(int x){if(x<10) return 1;return len(x/10)+1;}// 取x的第k位数字static int f(int x, int k){if(len(x)-k==0) return x%10;return ______________________;  //填空}public static void main(String[] args){int x = 23513;//System.out.println(len(x));System.out.println(f(x,3));}
}

递归

答案:f(x/10, k)


6. 最大公共子串(代码填空 - 9分)

最大公共子串

最大公共子串长度问题就是:求两个串的所有子串中能够匹配上的最大长度是多少。

比如:“abcdkkk” 和 “baabcdadabc”,
可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。

下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。
请分析该解法的思路,并补全划线部分缺失的代码。

注意:只提交缺少的代码,不要提交已有的代码和符号。也不要提交说明性文字。

public class Main
{static int f(String s1, String s2){char[] c1 = s1.toCharArray();char[] c2 = s2.toCharArray();int[][] a = new int[c1.length+1][c2.length+1];int max = 0;for(int i=1; i<a.length; i++){for(int j=1; j<a[i].length; j++){if(c1[i-1]==c2[j-1]) {a[i][j] = __________________;  //填空 if(a[i][j] > max) max = a[i][j];}}}return max;}public static void main(String[] args){int n = f("abcdkkk", "baabcdadabc");System.out.println(n);}
}

动态规划

答案:a[i-1][j-1]+1


7. 日期问题(程序设计 - 19分)

日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960
年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年
/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两
位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

----------
输入
一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)
输入
输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。
多个日期按从早到晚排列。

----------
样例输入
02/03/04
样例输出
2002-03-04
2004-02-03
2004-03-02

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

/*1. 日期格式:AA/BB/CC 转为 a,b,c三个数字2. 有三种情况 a/b/c ---(a,b,c)(c,a,b)(c,b,a)3. getDate(y,m,d) 判断合成的日期是否符号实际,返回字符串。4. 判断日期是否符合时,注意闰年二月的判断5. 使用TreeSet去重
*/
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.next();// 从字符串中截取年月日int a = (str.charAt(0)-'0')*10+str.charAt(1)-'0';int b = (str.charAt(3)-'0')*10+str.charAt(4)-'0';int c = (str.charAt(6)-'0')*10+str.charAt(7)-'0';// 三种情况String case1 = getDate(a,b,c);String case2 = getDate(c,a,b);String case3 = getDate(c,b,a);// TreeSet可去重和排序Set<String> ans = new TreeSet<String>();if(case1!="")ans.add(case1);if(case2!="")ans.add(case2);if(case3!="")ans.add(case3);for(String s:ans) {System.out.println(s);}}static String getDate(int a, int b, int c) {// 年份校验if(a>=0 && a<=59) a = a+2000;else if(a>=60 && a<=99) a = a+1900;else return "";// 月份校验if(b<1 || b>12)return "";// 日期校验if(c<1 || c>31)return "";switch(b) {case 2:if(isLeap(a)) {if(c>29) return "";}else {if(c>28) return "";}break;case 4:if(c>30)return "";break;case 6:if(c>30)return "";break;case 9:if(c>30)return "";break;case 11:if(c>30)return "";break;default:break;}//没问题后处理格式String y=a+"",m=b+"",d=c+"";if(b<10) m = "0" + b;if(c<10) d = "0" + c;String date = y + "-" + m +"-" + d;return date;}static boolean isLeap(int year) {return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;}
}

8. 包子凑数(程序设计 - 21分)

包子凑数

小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。

每当有顾客想买X个包子卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。

当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有3种蒸笼,分别能放4、5和6个包子。而顾客想买7个包子时,大叔就凑不出来了。

小明想知道一共有多少种数目是包子大叔凑不出来的。

----------
输入
第一行包含一个整数N。(1 <= N <= 100)
以下N行每行包含一个整数Ai。(1 <= Ai <= 100)
输出
一个整数代表答案。如果凑不出的数目有无限多个,输出INF。

----------
例如:
输入:
2
4
5
输出:
6
再例如,
输入:
2
4
6
输出:
INF

样例解释:
对于样例1,凑不出的数目包括:1, 2, 3, 6, 7, 11。
对于样例2,所有奇数都凑不出来,所以有无限多个。

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

/*1. 如果a1、a2、a3...互质, 则凑不出的数目为有限个。不互质,数目为无限个。2. 如果是有限个, 就要统计数目。用完全背包求解不能解的个数。3. dp[0] = 1 初状态0一定能凑出来。4. dp[j] = Math.max(dp[j], dp[j-a[i]])
*/
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] a = new int[n];int[] dp = new int[10000];int ans = 0;for(int i=0; i<n; i++) {a[i] = sc.nextInt();}// 判断a1、a2、a3...是否互质int g=a[0];for(int i=1; i<n; i++) {g = gcd(g,a[i]);}// 不互质,无限个if(g!=1) {System.out.println("INF");return;}// 互质,完全背包算法统计个数dp[0] = 1; // 0是能凑出的for(int i=0; i<n; i++)for(int j=a[i]; j<10000; j++) dp[j] = Math.max(dp[j], dp[j-a[i]]);for(int i=0; i<10000; i++) {if(dp[i]==0)ans++;}System.out.println(ans);return;}static int gcd(int a, int b) {return b==0?a:gcd(b,a%b);}
}

9. 分巧克力(程序设计 - 23分)

分巧克力

儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。

为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:
1. 形状是正方形,边长是整数
2. 大小相同

例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?

----------
输入
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含两个整数Hi和Wi。(1 <= Hi, Wi <= 100000)
输入保证每位小朋友至少能获得一块1x1的巧克力。
输出
输出切出的正方形巧克力最大可能的边长。

----------
样例输入:
2 10
6 5
5 6
样例输出:
2

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

/*1. 暴力枚举。Hi, Wi <= 100000,从边长为100000开始向下遍历2. 二分法优化
*/
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int k = sc.nextInt();int[] h = new int[n];int[] w = new int[n];int len = 100000;for(int i=0; i<n; i++) {h[i] = sc.nextInt();w[i] = sc.nextInt();}int l = 1, r=100001;while(l<=r) {int mid = (l+r)/2;int cnt = 0;for(int i=0; i<n; i++) {cnt = cnt + w[i]/mid * h[i]/mid;}if(cnt >= k) {l = mid+1;len = mid;}else r = mid-1;}System.out.println(len);}
}

10. k倍区间(程序设计 - 25分)

k倍区间

给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj (i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。

你能求出数列中总共有多少个K倍区间吗?

-----------
输入
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)
输出
输出一个整数,代表K倍区间的数目。

----------
输入:
5 2
1
2
3
4
5
程序应该输出:
6

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

/*1. 暴力解决。3个for循环10w数据会超时2. 优化一:前缀和【增加一个前缀和数组,便于计算区间和】但也会超时3. 优化二:数学技巧【如果两个数除k的余数相同,那这两个数的差是k的倍数】把余数相同的统计一下,从中挑两个作差一定是k的倍数。变成了组合的问题(m个数选两个有多少种)
*/
// 优化一
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int k = sc.nextInt();int[] a = new int[n+1];int[] s = new int[n+1];int ans = 0;s[0] = 0;for(int i=1; i<=n; i++) {a[i] = sc.nextInt();s[i] = s[i-1] + a[i];}for(int i=1; i<n; i++) {for(int j=i; j<=n; j++) {if((s[j]-s[i-1])%k == 0) ans++;}}System.out.println(ans);}
}
// 优化二
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int k = sc.nextInt();int[] a = new int[n+1];int[] s = new int[n+1];long ans = 0;int cnt = 0;s[0] = 0;Map<Integer, Integer> map = new HashMap<Integer,Integer>(); map.put(0, 1);for(int i=1; i<=n; i++) {a[i] = sc.nextInt();s[i] = (s[i-1] + a[i])%k;// 用HashMap来统计余数相同的个数if(!map.containsKey(s[i])) {map.put(s[i], 1);}else {cnt = map.get(s[i])+1;map.put(s[i], cnt);}}for(int i=0; i<k; i++) {ans += (long)map.get(i)*(long)(map.get(i)-1)/2; //m(m-1)/2}System.out.println(ans);}
}

蓝桥杯 Java B组省赛真题【2017】相关推荐

  1. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

  2. 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  3. 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  4. 2018年 第9届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

  5. 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...

  6. 2017年 第8届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  7. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第2场省赛 2020.10.17】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 说明:大部分题解思路及程序代码 源自 蓝桥杯 官网视频(Java B组历年真题解析) -- 郑未老师. ...

  8. java黄金连分数_蓝桥杯 | Java B组省赛真题练习——黄金连分数-Go语言中文社区...

    标题: 黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些 精密工程,常数的精度很重要.也许你听说过哈勃太空望远 ...

  9. 2018第九届蓝桥杯Java C组 省赛真题

    文章目录 一.哪天返回 1.题目 2.解法 2.1 解法一 2.1 解法二 二.猴子分香蕉 1.题目 2.解法 2.1方法一 2.2方法二 三.字母阵列 1.题目 2.解题 四.第几个幸运数 1.题目 ...

  10. 2020 第十一届蓝桥杯java C组 省赛真题

    第一题 试题 A: 指数计算 本题总分:5 分 [问题描述] 7 月 1 日是建党日,从 1921 年到 2020 年, 已经带领中国人民 走过了 99 年. 请计算:7 ^ 2020 mod 192 ...

最新文章

  1. stdio.h头文件中申明的基本函数
  2. OpenCV添加图像轨迹轨迹条 Adding Images Trackbar的实例(附完整代码)
  3. WPF中使用WindowChrome自定义窗口中遇到的最大化问题
  4. 二年级小学生四则运算30道题目
  5. ASP.NET小收集:Word的编码是Unicode
  6. 动点四边形周长最短_初中几何--线段之和最小值 Part 1:通过点关于直线对称点得到两定点之间直线段长度最短。...
  7. linux mysql服务基础操作(二)
  8. c 给定字符串中查找_【C进阶】练习题(一)
  9. C# 列表中查找大小比较
  10. 【数据结构笔记33】C实现:希尔排序、增量序列
  11. log4j.xml按照日期生成_荐读 | 进项发票快速生成凭证!这个功能太方便了!
  12. 批量转换Caltech Pedestrian Dataset中annotations中的.vbb文件为.txt文件
  13. 微信降级adb备份android7.0,微信自动帮你更新7.0了?简单两步轻松降级
  14. 维基百科反对法国将被遗忘权全球化
  15. bitwise ssh client的使用
  16. 压缩、减员、并购、自动汽车市场凛冬将至!
  17. Sentinel Dubbo 适配器看限流与熔断(实战思考篇)
  18. Vector BLF格式转ASC格式软件 QT+C++编写
  19. Word文档自动关闭,再打开时全是空白解决方案
  20. mysql导出udf失败_udf提权方法和出现问题汇总

热门文章

  1. 教你自定义收支类别,收支账户进行记账
  2. [USB 设备检测_1]-使用 H2testw 1.4 或其她工具检测新买的朗科 U 盘读写速度及是否是扩容盘
  3. IPv6组播技术原理
  4. 测试opencl软件,我该如何测试OpenCL的可兼容性?
  5. springcloud视频教程免费下载
  6. 加密解密之 crypto-js 知识
  7. uni-app:mescroll-uni 实现上拉加载,下拉刷新
  8. 金蝶KIS应用虚拟化集成解决方案
  9. SQL数据库注入防范 ASP.NET Globle警告
  10. SSM框架的整合原理以及执行流程