Acwing周赛101,102

一 解方程(简单)

给定一个一元二次方程 ax2+bx+c=0,保证给定方程有解,且恰好有两个不同的实数根

请你对该方程进行求解。

一元二次方程求根公式为:

 

输入格式

共一行,包含三个整数 a,b,c。

输出格式

共两行,第一行输出较大的根,第二行输出较小的根。

结果保留六位小数。

数据范围

所有测试点满足 −1000≤a,b,c≤1000,保证给定方程有解,且恰好有两个不同的实数根。

输入样例:

1 30 200

 输出样例:

-10.000000

-20.000000

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int a,b,c;
        a=in.nextInt();
        b=in.nextInt();
        c=in.nextInt();
        double max,min;
        max=((Math.sqrt(Math.pow(b,2)-4*a*c))-b)*1.0/(2*a);
        min=((Math.sqrt(Math.pow(b,2)-4*a*c))+b)*(-1.0)/(2*a);
        System.out.println(String.format("%.6f",Math.max(max,min)));
        System.out.println(String.format("%.6f",Math.min(min,max)));
    }
}

 总结

101周的打卡题,但直播时y总说比之前的正确率低了一些。这题掌握Math的基本函数和小数位的处理即可。

 二 栈(中等)

给定一个栈,初始时栈为空。

你需要依次进行 n 个操作。

每个操作给定一个由小写字母构成的非空字符串,随后进行判断:

  • 如果栈中已经包含该字符串,则将该字符串上升至栈顶,栈中其它元素的相对顺序保持不变。
  • 如果栈中还未包含该字符串,则将该字符串直接插入到栈的顶部。

所有操作完成后,请你按照从栈顶到栈底的顺序,依次输出栈内所有元素。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个由小写字母构成的非空字符串。

输出格式

按照从栈顶到栈底的顺序,依次输出栈内所有元素。

每个元素占一行。

数据范围

前 5 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤2×10e5,每个给定字符串的长度范围 [1,10]。

输入样例1:

4
apple
pear
banana
pear

 输出样例1:

 pear
banana
apple

 输入样例2:

 8
pen
book
eraser
desk
desk
eraser
book
pen

 输出样例2:

pen
book
eraser
desk

import java.util.HashSet;
import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner in=new Scanner(System.in);
		HashSet<String> hs=new HashSet<>();
		int n=in.nextInt();
		String[] arr=new String[n];
		for(int i=0;i<n;i++){
			arr[i]=in.next();
		}
		String[] res=new String[n];
		int index=0;
		for(int i=n-1;i>=0;i--){
			if(hs.contains(arr[i])){
				continue;
			}
			hs.add(arr[i]);
			res[index++]=arr[i];
		}
		for(int i=0;i< index;i++){
			System.out.println(res[i]);
		}
	}
}

 总结

 此题为模拟一个栈,利用java中有的集合来操作会更简单。首先你需要知道是需要进行去重操作的,从前往后入栈的话,达不到我们想要的指定位该单词出现的最后位置,所以我们需要逆向思维。我们需要两个字符串数组来进行操作,还需要一个HashSet的集合对象即可完成题目

 三 或运算(简单)

 

给定两个长度为 n 的整数序列 a1,a2,…,an 以及 b1,b2,…,bn。

设 A=a1 or a2 or … or an,B=b1 or b2 or … or bn。

请你计算并输出 A+B 的值。

oror 表示按位或运算。

输入格式

第一行包含整数 n。

第二行包含 n 个整数 a1,a2,…,an。

第三行包含 n 个整数 b1,b2,…,bn。

输出格式

一个整数,表示 A+B 的值。

数据范围

前 33 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤1000,0≤ai,bi≤10e9。

 输入样例1:

5
1 2 4 3 2
2 3 3 12 1

 输出样例1:

 22

 输入样例2:

10
13 2 7 11 8 4 9 8 5 1
5 7 18 9 2 3 0 11 8 6

 输出样例2:

46 

import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int[] arr1=new int[n];
		int[] arr2=new int[n];
		for(int i=0;i<n;i++){
			arr1[i]=in.nextInt();
		}
		for(int i=0;i<n;i++){
			arr2[i]=in.nextInt();
		}
		long sum1=0,sum2=0;
		for(int i=0;i<n;i++){
			sum1=sum1|arr1[i];
			sum2=sum2|arr2[i];
		}
		System.out.println(sum1+sum2);
	}
}

 总结

此题只需要明白什么是或运算即可,可以开展一下|,&的含义,底层是数字变成二进制的操作。

 四 倍增(中等)

给定一个长度为 n 的整数序列 a1,a2,…,an。

你可以对该序列进行任意次倍增操作(也可以不进行任何操作)。

每次倍增操作可以任选序列中的一个元素,并将其乘以 2 或乘以 3。

我们的目标是让序列中所有元素的值都相等。

请你判断,目标是否能够实现。

输入格式

第一行包含整数 n。

第二行包含 n个整数 a1,a2,…,an。

输出格式

如果可以让序列中所有元素的值都相等,则输出 Yes,否则,输出 No

数据范围

前 6个测试点满足 2≤n≤10。
所有测试点满足 2≤n≤10e5,1≤ai≤10e9。

 输入样例1:

4

75 150 75 50

 输出样例1:

 Yes

 输入样例2:

3

100 150 250

输出样例2:

No

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		long[] arr=new long[n];
		for(int i=0;i<n;i++){
		    arr[i]=in.nextLong();
		    while(arr[i]%2==0){
		        arr[i]/=2;
		    }
		    while(arr[i]%3==0){
		        arr[i]/=3;
		    }
		}
		boolean key=true;
		for(int i=1;i<n;i++){
		    if(arr[i]!=arr[i-1]){
		        key=false;
                break;
		    }
		}
		String res=key?"Yes":"No";
		System.out.println(res);
	}
}

总结

 有点偏数论了,当时我是想着找最大值,然后往上开几次,结果只能过16/20个数据。后来想了想应该只能往下开,即找出除了2,3的坤质数后比较即可。往上开是没有上线的,可往下开是有下线的

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值