class main1 { public static void main(String[] args) throws IOException { BufferedReader brnew BufferedReader(new InputStreamReader(System.in)); int nInteger.parseInt(br.readLine()); //输入数组元素 String[]sbr.readLine().split( ); long[]anew long[n]; for(int i0;in;i){ a[i]Long.parseLong(s[i]); } //cur记录当前元素和上一个元素相乘的最大值若改变则记录当前元素的下标curId BigInteger maxBigInteger.valueOf(-1); BigInteger sumBigInteger.valueOf(0); int curId0; for(int i1;in;i){ BigInteger curValBigInteger.valueOf(a[i]); BigInteger lastValBigInteger.valueOf(a[i-1]); BigInteger curcurVal.multiply(lastVal); if(cur.compareTo(max)0){ curIdi; maxcur; } sumsum.add(curVal); } BigInteger anssum.add(max) .add(BigInteger.valueOf(a[0])) .subtract(BigInteger.valueOf(a[curId])) .subtract(BigInteger.valueOf(a[curId-1])); System.out.println(ans); } }import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Array; import java.math.BigInteger; import java.util.*; public class Main { public static void main(String[] args) { //输入 Scanner scnew Scanner(System.in); int nsc.nextInt(); int[]anew int[n]; long sum0; for(int i0;in;i){ a[i]sc.nextInt(); suma[i]; } //众数的最大可能出现次数是n/n-1 //n--sum%n0所有元素全部相同 //n-1--sum%n!0需要舍弃一个元素,剩下n-1个元素全部相同 long ans0L; if(sum%n0){ //n个元素相同众数出现次数为n long targetsum/n; anscalOps(a,target,-1); }else{ //n-1个元素相同众数出现次数为n-1 Arrays.sort(a); //比较排除最大值/最小值后哪种情况得到的操作数更小 ansMath.min(cal(a,sum,0), cal(a,sum,a.length-1)); } System.out.println(ans); } //排除一个元素后计算最小操作数 private static long cal(int[] a, long sum, int exId) { sumsum-a[exId]; long targetsum/(a.length-1); if(sum%(a.length-1)0){ //能整除 return calOps(a,target,exId); }else{ //不能整数target上下分别取整计算一次 return Math.min(calOps(a,target,exId),calOps(a,target1,exId)); } } //计算 把元素变成target的操作数 private static long calOps(int[] a, long target, int exId) { long add0L; long minus0L; for(int i0;ia.length;i){ if(iexId)continue;//跳过被排除的元素 if(target-a[i]0){ addtarget-a[i];//累加需要增加的次数 }else{ minusa[i]-target;//累计需要减少的次数 } } //每次操作可以同时处理一次add和minus抵消后剩下的差由被排除的元素承担 return Math.max(add,minus); } }import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.math.BigInteger; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; //相邻字符都不相等的01串只有两种可能 //0开头01交替 //1开头10交替 public class Main { static boolean isAchieved; public static void main(String[] args) { Scanner scnew Scanner(System.in); char[]ssc.next().toCharArray(); int ns.length; int[][][]dpnew int[n][n][2]; int res0; //dp[i][j][k]子串i~j变成结尾为k的交替串需要反转的次数 dp[0][0][s[0]-0]0;//结尾是原字符翻转次数0 dp[0][0][1-s[0]0]1;//结尾是翻转后的字符翻转次数1 for(int i0;in;i){ for(int ji;jn;j){ if(i0j0)continue;//已完成初始化跳过 int bits[j]-0;//当前字符原始值 //以当前字符结尾翻转次数等于【i,j-1】结尾为1-bit和当前位不同的次数 dp[i][j][bit]dp[i][j-1][1-bit]; //以当前字符翻转结尾翻转次数等于【i,j-1】结尾为bit的次数1翻转一次 dp[i][j][1-bit]dp[i][j-1][bit]1; //累加最小值 resMath.min(dp[i][j][bit],dp[i][j][1-bit]); } } System.out.println(res); } }class main4{ public static void main(String[] args) { Scanner scnew Scanner(System.in); int qsc.nextInt(); while(q--0){ double msc.nextInt(); double xsc.nextInt(); if(x%m0){ System.out.println((int)m); }else{ System.out.println((int)(x%m)); } } sc.close(); } }class main5{ public static void main(String[] args) { Scanner scnew Scanner(System.in); int tsc.nextInt(); while(t--0){ int nsc.nextInt();//数组长度 int ksc.nextInt();//操作次数 //输入数组元素 int[]anew int[n]; for(int i0;in;i){ a[i]sc.nextInt(); } //加减操作 for(int i0;ik;i){ int usc.nextInt(); int vsc.nextInt(); a[u-1]1; a[v-1]-1; } //判断是否升序 boolean oktrue; for(int i1;in;i){ if(a[i]a[i-1]){ okfalse; break; } } if(ok) System.out.println(Yes); else System.out.println(No); } sc.close(); } }import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Array; import java.math.BigInteger; import java.util.*; //DP public class Main { static final int MOD1000000007; public static void main(String[] args) { Scanner scnew Scanner(System.in); int nsc.nextInt(); long[]anew long[n]; long sum0; for(int i0;in;i){ a[i]sc.nextInt(); suma[i]; } //dp[i][j] //从后往前用j~n-1位置上的数凑出总和为i的方案总数 long[][]dpnew long[(int)(sum1)][n1]; dp[0][n]1;//凑出0只有一种方案即空方案 //遍历要凑的总和 for(long i1;isum;i){ //倒序遍历数组 //算j前必须先知道j1的方案 for(int jn-1;j0;j--){ long res0; //枚举当前可选的数字 //在当前位置的后面还有n-1-j个位置没处理 //所选的数不能太大综合推导为i-(n-1-j) for(long k1;ki-(n-1-j);k){ if(a[j]k){//不能选和原数组上的元素一样的数 continue; } //剩下的和i-k由j1位往后凑 //在j位置凑了k剩下的i-k需要由后面的j1~n-1去凑 res(res%MODdp[(int)(i-k)][j1])%MOD; } dp[(int)i][j]res; } } System.out.println(dp[(int)sum][0]); } }1. 按商家名字的字典序升序输出自动按 key 排序不用额外写排序代码TreeMapkey 是 String默认按字典序自然排序2. 按商家名字分组每个名字对应多个地址键值对映射key 是商家名value 是地址集合Map这里用TreeMap同时解决排序问题3. 同名商家不能重复地址重复则注册失败地址集合自动去重重复元素不被添加Set自带去重特性4. 要拿到「第一次注册的地址」主店地址地址集合要保留插入顺序能快速拿到第一个元素LinkedHashSet按插入顺序保存元素有序的 Setimport java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Array; import java.math.BigInteger; import java.util.*; public class Main { public static void main(String[] args) { Scanner scnew Scanner(System.in); int nsc.nextInt(); String ssc.nextLine();//读取空行 //外层TreeMap解决「按名字字典序排序 按名字分组」 //内层LinkedHashSet解决「地址去重 保留插入顺序主店地址」 //商店名地址集合 MapString,SetStringmapnew TreeMap(); for(int i0;in;i){ String[]megsc.nextLine().split( ); String meg0meg[0].toLowerCase(); String meg1meg[1].toLowerCase(); //确保全小写输入 if(meg0.equals(meg[0])meg1.equals(meg[1])){ //getOrDefault如果商家名字不存在就新建一个空的 //LinkedHashSet按插入顺序保存元素确保第一家是主店后面的是分店 SetStringaddrmap.getOrDefault(meg0,new LinkedHashSet()); addr.add(meg1);//set自动去重 map.put(meg0,addr); } } for(Map.EntryString,SetString entry:map.entrySet()){ System.out.println(entry.getKey() entry.getValue().iterator().next() (entry.getValue().size()-1)); } } }