0
点赞
收藏
分享

微信扫一扫

JAVA习题练习:Candy


目录

  • ​​🍋题目描述​​
  • ​​🍋思路​​
  • ​​三重暴力:超出时间溢出​​
  • ​​数学分析​​
  • ​​🍋源代码​​
  • ​​三重暴力:超出时间溢出​​
  • ​​数学分析​​

🍋题目描述

JAVA习题练习:Candy_java

🍋思路

三重暴力:超出时间溢出

想的是暴力。
三重for循环。
每一重代表一份。
三重则三份。
结果超出时间限制了。
时间复杂度还是太大了。
等想到方法了,再补充把

数学分析

不暴力循环了。
从1到n,我们直接算出有多少个能直接被3整除的数,多少个被3除余1的数,多少个被3除余2的数。
之后就直接数学分析。
从直接被3整除的数中挑选三个,必然满足条件。被3除余1的数,被3除余2的数,也是一样。
之后从这三者中各挑选一个也成立。
以上四种情况就全考虑到了。

需要注意的点是,整型存储时,数值很大,用long。

🍋源代码

三重暴力:超出时间溢出

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(true) {
int n=in.nextInt();
if(n==0) return;

long sum=0;
for(int i=1;i<=n-2;i++) {
for(int j=i+1;j<=n-1;j++) {
for(int k=j+1;k<=n;k++) {
if((i+j+k)%3==0)
sum=(sum+1)%1000000009;
}
}
}
System.out.println(sum);
}
}

}

数学分析

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(true) {//请不要照抄我的代码
int n=in.nextInt();
if(n==0) return;
int t=n%3;//稍微改改变量名,和先后顺序之类的
long x=n/3%1000000007;
long y=0,z=0;
if(t==0) {
y=x;
z=x;
}
else if(t==1) {
y=x+1;
z=x;
}else {
y=x+1;
z=x+1;
}
long sum=0;
sum=((x*(x-1)*(x-2))/6 +(y*(y-1)*(y-2))/6+(z*(z-1)*(z-2))/6+x*y*z)%1000000007;
System.out.println(sum);
}
}
}

JAVA习题练习:Candy_java_02


举报

相关推荐

0 条评论