CCF 201809 前两题 Java解法

1.卖菜

问题描述

  在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。
  第一天,每个商店都自己定了一个价格。店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己和相邻商店的价格调整自己的价格。具体的,每家商店都会将第二天的菜价设置为自己和相邻商店第一天菜价的平均值(用去尾法取整)。
  注意,编号为1的商店只有一个相邻的商店2,编号为n的商店只有一个相邻的商店n-1,其他编号为i的商店有两个相邻的商店i-1和i+1。
  给定第一天各个商店的菜价,请计算第二天每个商店的菜价。

输入格式

  输入的第一行包含一个整数n,表示商店的数量。
  第二行包含n个整数,依次表示每个商店第一天的菜价。

输出格式

  输出一行,包含n个正整数,依次表示每个商店第二天的菜价。

样例输入

8
4 1 3 1 6 5 17 9

样例输出

2 2 1 3 4 9 10 13

数据规模和约定

  对于所有评测用例,2 ≤ n ≤ 1000,第一天每个商店的菜价为不超过10000的正整数。

思路

主要解题思路如下。将所有店铺的菜价存为三个数组。a为所有店的菜价。l存储a中每个店左边店的菜价,r存储右边店的菜价。

除了第一家和最后一家之外,其他店的价格就是(a[i]+l[i]+r[i])/3.

Java代码


import java.util.*;
public class Main2018091 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int [] a = new int [n];
		
		int [] l = new int [n+1];
		l[0]=0;
		int [] r = new int [n+1];
		
		
		int [] res = new int [n];
		for(int i=0,j=1;i<n&&j<n+1;i++,j++) {
			a[i] = scan.nextInt();
			l[j] = a[i];
		}
		for(int i=1,k=0;i<n&&k<n+1;i++,k++) {
			r[k] = a[i];
		}
		l[0]=0;r[n]=0;
		
		for(int i=0;i<n;i++) {
			if(i==0) {
				res[i] = (a[i]+r[i])/2;
			}else if(i==n-1) {
				res[i] = (a[i]+l[i])/2;
			}else {
				res[i] = (a[i]+l[i]+r[i])/3;
			}
			System.out.print(res[i]+" ");
		}
	}
}

2.买菜

问题描述

  小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装n次车。具体的,对于小H来说有n个不相交的时间段[a1,b1],[a2,b2]...[an,bn]在装车,对于小W来说有n个不相交的时间段[c1,d1],[c2,d2]...[cn,dn]在装车。其中,一个时间段[s, t]表示的是从时刻s到时刻t这段时间,时长为t-s。
  由于他们是好朋友,他们都在广场上装车的时候会聊天,他们想知道他们可以聊多长时间。

输入格式

  输入的第一行包含一个正整数n,表示时间段的数量。
  接下来n行每行两个数ai,bi,描述小H的各个装车的时间段。
  接下来n行每行两个数ci,di,描述小W的各个装车的时间段。

输出格式

  输出一行,一个正整数,表示两人可以聊多长时间。

样例输入

4
1 3
5 6
9 13
14 15
2 4
5 7
10 11
13 14

样例输出

3

数据规模和约定

  对于所有的评测用例,1 ≤ n ≤ 2000, ai < bi < ai+1,ci < di < ci+1,对于所有的i(1 ≤ i ≤ n)有,1 ≤ ai, bi, ci, di ≤ 1000000。

思路

相当于统计两个人相同的时间段,因此使用map先存储小H装车包含了哪些时间段。

输入小W时间段的时候,判断小W包含的时间段哪些与小H重合了,计数加1.

最后输出计数即可。

Java代码

import java.util.*;
public class Main2018092 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		HashMap<String,Boolean> map = new HashMap<>();
		for(int i = 0;i<n;i++) {
			int a = scan.nextInt();
			int b = scan.nextInt();
			for(int j=a;j<b;j++) {
				map.put(j+","+j+1, true);
			}
		}
		int res =0;
		for(int i = 0;i<n;i++) {
			int a = scan.nextInt();
			int b = scan.nextInt();
			for(int j=a;j<b;j++) {
				if(map.containsKey(j+","+j+1))
					res++;
				
			}
		}
		System.out.print(res);
	}

}

猜你喜欢

转载自blog.csdn.net/paranior/article/details/108639432