zoukankan      html  css  js  c++  java
  • 【Codeforces 479D】Long Jumps

    【链接】 我是链接,点我呀:)
    【题意】

    如果存在a[j]-a[i]=d 那么认为可以量出来长度d 现在给你量尺上的n个点. 问你最少要加多少个点,才能够量出来长度x和长度y

    【题解】

    设dic1和dic2分别为 能量出长度x和长度y需要添加的点(所有能利用某个a[i]量出来长度为x或y的点) (输入a[i]的话,就把a[i]-x和a[i]+x加入dic1,把a[i]-y和a[i]+y加入dic2 (一开始我只加了a[i]-x......傻逼了) 如果一开始就能量出来x和y(不用这两个集合里面的元素(代码里面用的是map) 则输出0 否则 如果长度x和长度y都一开始不能量出来 那么需要添加点 添加几个点呢? 添加两个点是肯定可以的(x,y) 但是我们可以想办法让他变得更优. 怎么办呢? 我们可以遍历dic1中的所有数字tmp 如果在dic2中也有出现的话 那就说明这个数字tmp可以让x和y都能量出来. 则输出tmp就可以了. 就这点比较特殊 其他的都比较容易想 只需输出x或者y就行

    【代码】

    import java.io.*;
    import java.util.*;
    
    public class Main {
        
        
        static InputReader in;
        static PrintWriter out;
            
        public static void main(String[] args) throws IOException{
            //InputStream ins = new FileInputStream("E:\rush.txt");
            InputStream ins = System.in;
            in = new InputReader(ins);
            out = new PrintWriter(System.out);
            //code start from here
            new Task().solve(in, out);
            out.close();
        }
        
        static int N = 50000;
        static class Task{
            int n,l,x,y;
            boolean ok1,ok2;
            Map<Integer,Integer> dic,dic1,dic2;
            
            public void solve(InputReader in,PrintWriter out) {
            	dic = new HashMap<Integer,Integer>();
            	dic1 = new HashMap<Integer,Integer>();
            	dic2 = new HashMap<Integer,Integer>();
            	ok1 = false;ok2 = false;
            	n = in.nextInt();l = in.nextInt();
            	x = in.nextInt();y = in.nextInt();
            	for (int i = 1;i <= n;i++) {
            		int ai;
            		ai = in.nextInt();
            		if (dic.containsKey(ai-x)) ok1 = true;
            		if (dic.containsKey(ai-y)) ok2 = true;
            		dic1.put(ai-x, 1);
            		dic1.put(ai+x, 1);
            		dic2.put(ai-y, 1);
            		dic2.put(ai+y, 1);
            		dic.put(ai, 1);
            	}
            	if (ok1 && ok2) {
            		out.println(0);
            	}else if (!ok1 && !ok2) {
            		for (Map.Entry<Integer,Integer> it:dic1.entrySet()) {
            			int x = it.getKey();
            			if (x<0) continue;
            			if (x>l) continue;
            			if (dic2.containsKey(x)) {
            				out.println(1);
            				out.println(x);
            				return;
            			}
            		}
            		out.println(2);
            		out.println(x+" "+y);
            	}else {
            		out.println(1);
            		if (!ok1) {
            			out.println(x);
            		}else {
            			out.println(y);
            		}
            	}
            }
        }
    
        
    
        static class InputReader{
            public BufferedReader br;
            public StringTokenizer tokenizer;
            
            public InputReader(InputStream ins) {
                br = new BufferedReader(new InputStreamReader(ins));
                tokenizer = null;
            }
            
            public String next(){
                while (tokenizer==null || !tokenizer.hasMoreTokens()) {
                    try {
                    tokenizer = new StringTokenizer(br.readLine());
                    }catch(IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                return tokenizer.nextToken();
            }
            
            public int nextInt() {
                return Integer.parseInt(next());
            }
        }
    }
    
  • 相关阅读:
    准备 FRM 考试——方法、工具与教训
    930. 和相同的二元子数组 前缀和
    1906. 查询差绝对值的最小值 前缀和
    剑指 Offer 37. 序列化二叉树 二叉树 字符串
    815. 公交路线 BFS
    518. 零钱兑换 II dp 完全背包
    1049. 最后一块石头的重量 II dp
    5779. 装包裹的最小浪费空间 二分
    5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口
    474. 一和零 dp
  • 原文地址:https://www.cnblogs.com/AWCXV/p/10427883.html
Copyright © 2011-2022 走看看