for循环模拟计算过程即可。
答案=624
public class A门牌制作 {
public static void main(String[] args) {
int ans=0;
for(int i=1;i<=2020;i++){
int temp=i;
while(temp!=0){
if(temp%10==2)ans++;
temp/=10;
}
}
System.out.println(ans);
}
}
枚举所有分子分母,求GCD,最终去重,
剩余的个数即为结果。
答案=2481215
import java.util.HashSet;
public class B既约分数 {
public static int gcd(int x,int y){
if(y==0)return x;
else return gcd(y,x%y);
}
public static void main(String[] args) {
int ans=0;
HashSet<Integer> set[]=new HashSet[2021];
for(int i=1;i<=2020;i++){
set[i]=new HashSet<Integer>();
for(int j=1;j<=2020;j++){
int t=gcd(i,j);
set[i/t].add(j/t);
}
}
for(int i=1;i<=2020;i++){
ans+=set[i].size();
}
System.out.println(ans);
}
}
根据数据找规律,
把矩阵看作从左下角到右上角,或者右上角到左下角的斜线,
那么,第n行,第n列,所对应的斜线为第2n-1条,
说明有2n-2条完整的斜线,每条斜线长度从一开始递增,每次+1,
即完整斜线上所有的数字总数为( 1 + 2 * n - 2 ) * ( 2 * n - 2 ) / 2;
剩下半条斜线上有n个数字,
即公式为( 1 + 2 * n - 2 ) * ( 2 * n - 2 ) / 2 + n;
答案=761
public class C蛇形填数 {
public static void main(String[] args) {
int n=20;
System.out.println((1+2*n-2)*(2*n-2)/2+n);
}
}
七个块,当作二进制进行枚举,一共128种可能,挨个找即可。
答案=80
public class D七段码 {
public static void main(String[] args) {
System.out.println(80);
//手查的
}
}
//待更新
按照题目所说进行模拟运算即可。
import java.util.Scanner;
public class F成绩分析 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int max=0,min=Integer.MAX_VALUE;
double sum=0;
for(int i=0;i<n;i++){
int t=sc.nextInt();
max=Math.max(max, t);
min=Math.min(min, t);
sum+=t;
}
System.out.println(max);
System.out.println(min);
System.out.println(String.format("%.2f", sum/n));
}
}
将时间获取到,分割为年月日,
三层循环嵌套时间枚举,对每种情况检查,符合条件即记录,找到答案结束程序即可。
import java.util.Scanner;
public class G回文日期 {
public static int tian[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
public static void isr(int x){
tian[2]=((x%4==0&&x%100!=0)||(x%400==0))?29:28;
}
public static boolean check(String s){
return s.equals(new StringBuilder(s).reverse().toString());
}
public static boolean check2(String s){
return s.charAt(0)==s.charAt(2)&&s.charAt(0)==s.charAt(5)&&s.charAt(0)==s.charAt(7)
&&s.charAt(1)==s.charAt(3)&&s.charAt(1)==s.charAt(4)&&s.charAt(1)==s.charAt(6);
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int year=n/10000,month=(n%10000)/100,day=n%100;
boolean first=true,line1=false,line2=false;
String str1="",str2="";
for(int i=year;i<=9999;i++){
isr(i);
for(int j=first?month:1;j<=12;j++){
for(int k=first?day:1;k<=tian[j];k++){
if(first){
first=false;
continue;
}
if(!line1&&check(i+""+(j<10?"0"+j:j)+""+(k<10?"0"+k:k))){
str1=i+""+(j<10?"0"+j:j)+""+(k<10?"0"+k:k);
line1=true;
}
if(!line2&&check2(i+""+(j<10?"0"+j:j)+""+(k<10?"0"+k:k))){
str2=i+""+(j<10?"0"+j:j)+""+(k<10?"0"+k:k);
line2=true;
}
if(line1&&line2){
System.out.println(str1);
System.out.println(str2);
return ;
}
}
}
}
}
}
我们可以通过计算每个字母所产生的贡献进行计算,观察发现,
某字母x与左边x的距离乘以与右边x的距离即为该字母产生的贡献,
记录左边距离left,记录右边距离right
ans=Σ(left[i]*right[i])
import java.util.Scanner;
public class H子串分值 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
char c[]=sc.next().toCharArray();
int left[]=new int[c.length];
int right[]=new int[c.length];
int buf[]=new int[26];
for(int i=0;i<26;i++)buf[i]=-1;
for(int i=0;i<c.length;i++){
left[i]=i-buf[c[i]-'a'];
buf[c[i]-'a']=i;
}
for(int i=0;i<26;i++)buf[i]=c.length;
for(int i=c.length-1;i>=0;i--){
right[i]=buf[c[i]-'a']-i;
buf[c[i]-'a']=i;
}
long ans=0;
for(int i=0;i<c.length;i++){
ans+=left[i]*right[i];
}
// System.out.println(Arrays.toString(left));
// System.out.println(Arrays.toString(right));
System.out.println(ans);
}
}
//无题源
//无题源