
Day 15平方数方法一循环把循环条件从遍历所有i只循环到i * i n为止importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);longnsc.nextLong();longx0,y0;for(longi1;;i){if(i*in){xi;yi-1;break;}}longretx*x;if(n-y*yx*x-n){rety*y;}System.out.println(ret);}}方法二使用 Math.sqrt()直接用平方根即可importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);longxsc.nextLong();longa(long)Math.sqrt(x);longy1a*a;longy2(a1)*(a1);if(x-y1y2-x){System.out.println(y1);}else{System.out.println(y2);}}}分组思路分组 二分查找题目很长把题目有效信息复制到代码注释中解题步骤先统计种类以及各个种类的数量分成 m 组当种类都大于 m 说明分不了直接返回 -1种类小于 m接下来就是要枚举最大人数使用二分查找枚举最大人数这个最大人数采纳分出来的组要最临近但是小于 m 组这个思路枚举出的最大值是所有合法最大值中的最小值importjava.util.*;// 每一组里的同学都必须擅长同一个声部// 不同组同学擅长同一个声部的情况是可以出现的// 不希望出现任何一组的人过多// 人数最多的小组的人尽可能少// 输出一个数表示人数最多的小组的人数// 无法顺利安排请输出-1// n个数,a[i](1≤a[i]≤n)表示第i个学生的擅长声部publicclassMain{staticintm0,n0;staticint[]cnt;publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);nsc.nextInt();msc.nextInt();intkind0;cntnewint[n1];// 只输入 n 个数, 每个数 a[i] n, 记录每个数出现的次数for(inti0;in;i){intxsc.nextInt();cnt[x];if(cnt[x]1)kind;}// 当种类大于分组数量, 无法安排if(kindm){System.out.println(-1);return;}// 二分查找分组后人数的最大值, 人数范围 (1~k), 在能分成 m 组的最大值中, 找最小值intl1,rn,minmaxn;while(lr){intmid(lr)/2;if(check(mid)){minmaxmid;rmid-1;}else{lmid1;}}System.out.println(minmax);}privatestaticbooleancheck(intk){// 此时 kind m, 一定可以分成 m 组, 因此需要枚举能分成 m 组时, 组最大值的最小值// 如果最大值是 k , 会分成 nead 组, nead 组必须在 m 内longneed0;for(inti1;in;i){if(cnt[i]0){// 向上取整// cnt[2] 3, k 2, 可以分为 (3 2 - 1)/2 组// cnt[2] 4, k 2, 可以分为 (4 2 - 1)/2 组need(cnt[i]k-1)/k;}}returnneedm;}}相关题目推荐爱吃香蕉的珂珂拓扑排序思路用Kahn 算法用邻接表存图同时统计每个点的入度indegree。把所有入度为0的点加入队列。每次从队列取出一个点加入拓扑序结果。遍历它指向的所有点将这些点的入度减一。如果某个点入度变成0就加入队列。最后如果结果数量等于n说明存在拓扑序否则说明图中有环输出-1。基于你的代码可以这样写importjava.util.*;importjava.io.*;publicclassMain{privatestaticReadinnewRead();privatestaticPrintWriteroutnewPrintWriter(newBufferedWriter(newOutputStreamWriter(System.out)));publicstaticvoidmain(String[]args)throwsIOException{intnin.nextInt(),min.nextInt();ListInteger[]graphnewArrayList[n1];for(inti1;in;i){graph[i]newArrayList();}int[]indegreenewint[n1];for(inti0;im;i){intuin.nextInt();intvin.nextInt();graph[u].add(v);indegree[v];}QueueIntegerqueuenewArrayDeque();for(inti1;in;i){if(indegree[i]0){queue.offer(i);}}int[]ansnewint[n];intidx0;while(!queue.isEmpty()){intcurqueue.poll();ans[idx]cur;for(intnext:graph[cur]){indegree[next]--;if(indegree[next]0){queue.offer(next);}}}if(idx!n){out.println(-1);}else{for(inti0;in;i){if(i0)out.print( );out.print(ans[i]);}out.println();}out.close();}}classRead{StringTokenizerstnewStringTokenizer();BufferedReaderbfnewBufferedReader(newInputStreamReader(System.in));Stringnext()throwsIOException{while(!st.hasMoreTokens()){Stringlinebf.readLine();if(linenull)returnnull;stnewStringTokenizer(line);}returnst.nextToken();}intnextInt()throwsIOException{returnInteger.parseInt(next());}}注意一个小细节next()方法最好用while不要只用if。因为输入里可能有空行用while更稳。