AtCoder Beginner Contest 154(题解思路+补题)

A - Remaining Balls

题目链接

题目大意:给你两种颜色,然后给你一个颜色,只要把那种颜色的数量减少一个就行了

import java.util.Scanner;

public class Main {
	static int maxn = 300 + 10;

	public static void main(String[] args) 
	{
		Scanner cin = new Scanner(System.in);
		int numa,numb;
		String stra,strb;
		stra=cin.next();
		strb=cin.next();
		numa=cin.nextInt();
		numb=cin.nextInt();
		String temp=cin.next();
		if(temp.equals(stra))
		{
			numa--;
		}
		else if(temp.equals(strb))
		{
			numb--;
		}
		System.out.println(numa+ " "+numb);
	}

}

B - I miss you...

题目链接

题目大意:给你的字母都换成X,一开始还以为他要过滤掉空格。。。

import java.util.Scanner;

public class Main {
	static int maxn = 300 + 10;

	public static void main(String[] args) 
	{
		Scanner cin = new Scanner(System.in);
		String str=cin.nextLine();
		for(int i=0;i

C - Distinct or Not

题目链接

题目大意:让你看看给你的数是不是都是不一样的,java map还是不熟的,不然直接map写起来就舒服了~

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	static int maxn = 300 + 10;

	public static void main(String[] args) 
	{
		Scanner cin = new Scanner(System.in);
		int a[]=new int [200000+100];
		int n=cin.nextInt();
		for(int i=0;i

D - Dice in Line

题目链接

题目大意:给你n个筛子,然后每一个筛子的最大点数都是不一样的是1~pi,概率一样,然后问你我要选择连续的K个筛子,我这K个要求是他们得到的点数期望值的和最大,并且这K个要连续取

思路:知道题意就好做了。。。。

就是求出来每一个的概率,我们最终可以发现他是 (1+2+...+pi)/pi =[(1+pi)*pi/2]/pi =(1+pi)/2。

然后整一个前缀和就行了,一开始java以为2e5 * 1e3不会T,高估了,搞一个前缀和就2e5的了

import java.util.Scanner;

public class Main {
	static int maxn = 300 + 10;

	public static void main(String[] args) 
	{
		Scanner cin = new Scanner(System.in);
		double a[]=new double [200000+100];
		int n=cin.nextInt();
		int k=cin.nextInt();
		a[0]=0;
		for(int i=1;i<=n;i++)
		{
			double s=cin.nextDouble();
			a[i]=a[i-1]+(s+1)/2;
			
		}
		double ans=0;
		for(int i=k;i<=n;i++)
		{
			if(a[i]-a[i-k]>ans)
				ans=a[i]-a[i-k];
		}
		System.out.println(ans);
	}

}

E - Almost Everywhere Zero

题目链接

题目大意:给你一个数str 可能会很大,然后问你从1~str中有多少个 特殊的数  

所谓特殊的数 一个数的组成里面正好有K个不为0的数字   比如100 那他就是由1个不为0的数字组成的数

K题中给出

思路:这个题还是看到一位大佬代码想到的

其实暴力就可以,首先因为这上面的K是比较少的,只有1,2,3这三个

还有就是,我们只需要枚举他的每一个数的位置和每一个数是什么就可以了,最大不超过1e9,感觉挺好的思路,就是有点费脑袋

本来想着那个判断的地方是比较好写的,后来我哭了。。。

import java.util.Scanner;

public class Main {
	static int maxn = 100 + 10;
	static String str;
	static int k,n;
	static int cnt[];
	public static void main(String[] args) 
	{
		Scanner cin = new Scanner(System.in);
		cnt =new int[maxn];
		str=cin.next();
		k=cin.nextInt();
		n=str.length();
		int ans=0;
		
		for(int i=0;i r)
	        return false;
	    if(l == 0)
	        return cnt[r]==0?false:true;
	    return cnt[r] - cnt[l - 1]==0?false:true;
	}
	public static boolean panduan1(int x,int a)
	{
		if(x!=0)
			return true;
		if(str.charAt(0)-'0' >= a)
	        return true;
	    return false;
	}
	public static boolean panduan2(int x,int y,int a,int b)
	{
		if(x!=0) 
			return true;
		if(str.charAt(0)-'0'> a)
	        return true;
	    if(str.charAt(0)-'0' < a)
	        return false;
	    
	    if(judge(x + 1, y - 1))
	        return true;
	    if(str.charAt(y)-'0'>= b)
	        return true;
		return false;
	}
	public static boolean panduan3(int x,int y,int z,int a,int b,int c)
	{
		if(x!=0)
	        return true;
	    if(str.charAt(0)-'0'> a)
	        return true;
	    if(str.charAt(0)-'0'< a)
	        return false ;
	    if(judge(x + 1, y - 1))
	        return true;
	    if(str.charAt(y)-'0'> b)
	        return true;
	    if(str.charAt(y)-'0'< b)
	        return false;
	    if(judge(y + 1, z - 1))
	        return true;
	    if(str.charAt(z)-'0'>= c)
	        return true;
	    return false;
	}
}

F - Many Many Paths

题目链接

明天再整。。。

你可能感兴趣的:(ATcode)