Codeforces Round #609 (Div. 2) D. Domino for Young

题目链接
题意是给定一个图,每一列的高度是递减的,问能在这个图中放多少12或21大小的块多少个.
通过观察可发现,当两个奇数高列之间有偶数个偶数高的列,这些能够全部覆盖的,两侧合并之后对能够的到的最大数没有影响,仍然可以继续这样办。
所以只需记录前面是否有奇数高列,和此次奇数高列和前面一个(除了已经消去的奇数高列)之间的偶数高列是否为偶数,如果为偶数就能完全覆盖。类似于栈操作。
AC代码如下。

import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
 
public class Main {
    static StreamTokenizer st = new StreamTokenizer(new BufferedInputStream(System.in));
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter pr = new PrintWriter(new BufferedOutputStream(System.out));
    static Scanner sc = new Scanner(System.in);
 
    public static void main(String[] args) {
//        long tic = System.currentTimeMillis();
        int n = nextInt();
        int arr[] = new int[n];
        long ans = 0;
        boolean isodd = false;
        int odnum = 0;
        for (int i = 0; i < n; i++) &#123;
            arr[i] = nextInt();
            ans += arr[i] / 2;
            if (arr[i] % 2 == 1 && isodd) &#123;
                isodd = false;
                odnum -= 1;
                ans++;
            &#125; else if (arr[i] % 2 == 1) &#123;
                odnum++;
                isodd = true;
            &#125; else &#123;
                if (odnum > 0)
                    isodd = !isodd;
                else 
                    isodd = false;
            &#125;
        &#125;
        System.out.println(ans);
 
//        long toc = System.currentTimeMillis();
//        System.out.println("Elapsed time: " + (toc - tic) + " ms");
    &#125;
 
    private static long A(long n, long k, long mod) &#123;
        long jcn = n;
        for (int i = 1; i < k; i++) &#123;
            jcn *= (n - i);
            jcn %= mod;
        &#125;
        return jcn;
    &#125;
 
    private static long C(long n, long k, long mod) &#123;
        long jcn = n;
        long jck = 1;
        for (int i = 1; i < k; i++) &#123;
            jcn *= (n - i);
            jcn %= mod;
            jck *= i;
            jck %= mod;
        &#125;
        jck *= k;
        jck %= mod;
        return jcn * pow(jck, mod - 2, mod) % mod;
    &#125;
 
    static long pow(long a, long b, long mod) &#123;
        long result = 1;
        while (b > 0) &#123;
            if (b % 2 == 1) &#123;
                result = (result * a) % mod;
            &#125;
            a = (a * a) % mod;
            b /= 2;
        &#125;
        return result;
    &#125;
 
    static int nextInt() &#123;
        try &#123;
            st.nextToken();
        &#125; catch (IOException e) &#123;
            e.printStackTrace();
        &#125;
        return (int) st.nval;
    &#125;
 
    static double nextDouble() &#123;
        try &#123;
            st.nextToken();
        &#125; catch (IOException e) &#123;
            e.printStackTrace();
        &#125;
        return st.nval;
    &#125;
 
    static String next() &#123;
        try &#123;
            st.nextToken();
        &#125; catch (IOException e) &#123;
            e.printStackTrace();
        &#125;
        return st.sval;
    &#125;
 
    static long nextLong() &#123;
        try &#123;
            st.nextToken();
        &#125; catch (IOException e) &#123;
            e.printStackTrace();
        &#125;
        return (long) st.nval;
    &#125;
&#125;

   转载规则


《Codeforces Round #609 (Div. 2) D. Domino for Young》 xfx 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Codeforces Round #609 (Div. 2) B. Modulo Equality Codeforces Round #609 (Div. 2) B. Modulo Equality
题目链接题意是给两个数列,问使数列一的所有数加上一个正整数,然后模于m后能变成数列二。这题主要排序后暴力即可,由于被hack了,所有总结下出现的错误。这里要注意: 一个数ans如果满足条件那么m-ans 也可能满足条件。注意只是可能 如果
2019-12-22
下一篇 
Linux 与win双系统时间不统一的解决方法 Linux 与win双系统时间不统一的解决方法
这个问题的原因是:Win和 Linux 对硬件时间的处理方法不同,一个将硬件时间作为本地时间,而另一个则处理为UTC时间。因此在中国UTC+8时区的情况下使用 Windows 和 Linux 会有八个小时的差异。 想要将两个时间统一最好的办
2019-12-12
  目录