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<str.length();i++)
			System.out.print("x");
	}

}

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<n;i++)
			{a[i]=cin.nextInt();}
		Arrays.sort(a,0,n);
		boolean flag=true;
		for(int i=1;i<n;i++)
		{
			//System.out.print(a[i]+" ");
			if(a[i]==a[i-1])
				flag=false;
		}
		if(flag)
			System.out.println("YES");
		else 
			System.out.println("NO");
	}

}

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<n;i++)
			if(str.charAt(i)!='0')
				cnt[i]=1;
		for(int i=1;i<n;i++)
			cnt[i]+=cnt[i-1];
		
		if(k==1)
		{
			for(int x=0;x<n;x++)
				for(int a=1;a<=9;a++)
					if(panduan1(x,a)) ans++;
		}
		else if(k==2)
		{
			for(int x=0;x<n;x++)
				for(int y=x+1;y<n;y++)
					for(int a=1;a<=9;a++)
						for(int b=1;b<=9;b++)
						{
							if(panduan2(x,y,a,b)) ans++;
						}
		}
		else if(k==3)
		{
			for(int x=0;x<n;x++)
				for(int y=x+1;y<n;y++)
					for(int z=y+1;z<n;z++)
						for(int a=1;a<=9;a++)
							for(int b=1;b<=9;b++)
								for(int c=1;c<=9;c++)
									if(panduan3(x,y,z,a,b,c))ans++;
		}
		System.out.println(ans);
	}
	public static boolean judge(int l,int r)
	{
		if(l > 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

题目链接

明天再整。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值