3.2w+
社区成员
1.很简单。不过需要注意的是if(count==99998)那个要与if(sushu(i))并列.
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
int count=0;
//在此输入您的代码...
for(int i=9;;i++){
if(sushu(i)){
count++;
}
if(count==99998){
System.out.println(i);
break;
}
}
}
public static boolean sushu(int n){
for(int i=2;i<=Math.sqrt(n);i++){
if(n%i==0){
return false;
}
}
return true;
}
}
2.
这题经典的DFS题目,首先看题目需要用到的方法,首先我们要构造exch方法,对每一个数进行交换,实现所有的可能,同时还需构造一个check方法,看看是否满足题目要求(要求编号相邻的书不能放在相邻的位置。)。由于知道需要回溯,所以构造dfs方法,在dfs中调用check以及exch方法实现对所有可能的筛选。
public class Main {
static int []arr={1,2,3,4,5,6,7,8,9,10};
static int ans=0;
public static void main(String[] args) {
dfs(0);
System.out.println(ans);
}
static void dfs(int k){
if(k==arr.length){
if(check()){
ans++;
}
}
for(int i=k;i<arr.length;i++){
exch(i,k);
dfs(k+1);
exch(i,k);
}
}
static boolean check(){
for(int i=0;i<arr.length-1;i++){
if(Math.abs(arr[i+1]-arr[i])==1){
return false;
}
}
return true;
}
static void exch(int a,int b){
int temp;
temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
}
3.这题好难,看了题解才勉强看懂,可能刚接触双指针不太了解。这题的思路主要是判断 arr[L][1]是否等于arr[R][1](当不等于的时候,判断这时候是否符合热帖的概念,即:arr[R][0]-arr[L][0]<d,R-L+1>=k。当满足上述两个条件时,令t=1,所以当t=1的时候,当前编号L为热帖)。最后需要对最后一个编号多进行一次判断。对了,值得一提的是,这里用Scanner输入输出会导致部分超时,这时用BR可以满足OJ。
import java.util.Arrays;
import java.io.*;
public class Shuangzhizhen {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws Exception {
int n=nextInt();
int d=nextInt();
int k=nextInt();
int[][]arr=new int[n][2];
for(int i=0;i<n;i++){
arr[i][0]=nextInt();
arr[i][1]=nextInt();
}
Arrays.sort(arr,((a,b)->{
if(a[1]!=b[1]){
return a[1]-b[1];
}
return a[0]-b[0];
}));
int t=0,s=0;
int []brr=new int[n];
int l=0;
for(int r=0;r<n;r++){
if(arr[r][1]!=arr[l][1]){
if(t==1){
brr[s++]=arr[l][1];
}
t=0;
l=r;
}
if(arr[r][0]-arr[l][0]>=d){
l++;
}
if(r-l+1>=k){
t=1;
}
}
if(t==1){
brr[s++]=arr[n-1][1];}
for(int i=0;i<s;i++){
pw.println(brr[i]);
pw.flush();
}
}
public static int nextInt() throws Exception {//int型
st.nextToken();
return (int) st.nval;
}
public static long nextLong() throws Exception {//long型
st.nextToken();
return (long) st.nval;
}
}
4.自己来看,最多只能暴力拿分。System.out.println((n*(n+1)/2)+2);不过看了怂佬的题解才明白,说实话这道题看起来不难,但实际上完全理解要花较多头脑。对了这里用到的return,当找到合适的数的时候,return会跳出当前的方法,不去执行最后System.out.println((n*(n+1)/2)+2);这一段代码了,这个时候就不能用break了。
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
long n=scan.nextLong();
int []arr=new int[44725];
arr[0]=1;
long k=1L;
if(n==1){
System.out.println(1);
}
for(int i=1;i<44725;i++){
for(int j=i;j>=1;j--){
arr[j]+=arr[j-1];
if(arr[j]==n){
System.out.println(k+i-j+1);//前四行所有的数加上当前行数i(i为当前行有多少个数)-j+1;
return;
}
}
k+=i+1;
}
System.out.println((n*(n+1)/2)+2);
scan.close();
}
}