Codeforces Round #496 (Div. 3)

一如既往地四题。。。好久没切了 有点犯困了明显脑子感觉不够灵活。

为了熟练度还是用java写的,,,导致观赏性很差。。。我好不容易拉了个队友一起切结果过掉a就tm挂机了!!!

A题竟然卡了,,,用了十分钟,幸好我蓝了,不然这罚时怕不是要gg。

A: 

  想了很多乱七八糟的法子,蓦然回首,还是暴力大法好。

  把所有 ai==1 的点的下标全存进去, 然后对 a(n-1) 判断一下是否 为 1 就行,   我不知道怎么打带下标的数组啊啊啊

  

        int n = nextInt();
        int a[] = new int[n];
        for(int i=0;i<n;i++){
            a[i] = nextInt();
        }
        int num = 0;
        int b[] = new int[n];
        for(int i=0;i<n;i++){
            if (a[i]==1)
                b[num++]=i;
        }
        out.println(num);
        for(int i=0;i<num;i++){
            if (b[i]==0){
                continue;
            }else
                out.print(a[b[i]-1]+" ");
        }
        if (a[n-1]==1)
            out.print(1);
        else {
            out.print(a[n-1]);
        }
        out.flush();
    }        
main 方法

B:一眼秒了,java写的话就跟a+b一样简单了。。。

 找两个字符串的最长相同后缀就完了。代码我就懒得放了

C:cnm毒瘤啊啊啊啊卡了好久才找到bug。。。用的map和set,到最后直接输出的set.size(),但是没考虑到去不掉的元素会有相同的。我是傻逼

  数组 c 是自己打的表 从1到2的29次方,,,因为stl里的各种方法可能不太一样,就比较难懂,但大体思路是一样的,话说我这种能在java和c++中间自由转换的能力可真是厉害呢   

  看到一个实验室的小伙伴竟然都没交几发试试,详细地说一下, set 存所有的元素,因为无法知道个数, 也用 map 存一遍 (用来 判断 4,4  这种一样的情况), 

首先我们发现这样一个事实: 如果一个较大的元素可以留下,那么  大于等于它自身的2的整数次幂 减去 它自己  得到 的数 一定存在set里 。(如果  513  可以留下,那么 511 一定存在)  所以直接走一遍就行。能找到配对的在set中全部 remove 掉,  到最后 遍历一边 set,通过 map 得到 set中 元素的 个数总和。

  

public static void main(String[] args) {
        int n = nextInt();
        int a[] = new int[n];
        Map<Integer,Integer> map = new HashMap<Integer, Integer>();
        Set<Integer> set = new HashSet<Integer>();
        for(int i=0;i<n;i++){
            a[i] = nextInt();
            set.add(a[i]);
            if (map.containsKey(a[i])){
                map.put(a[i],map.get(a[i])+1);
            }else {
                map.put(a[i],1);
            }
        }
        for(int i=0;i<n;i++) {
            int temp = -1;
            for (int j = 0; j < c.length; j++) {
                if (c[j] >= a[i]) {
                    temp = c[j] - a[i];
                    break;
                }
            }
            if (temp==0){
                if (map.get(a[i])>1){
                    set.remove(a[i]);
                }
            }else {
                if (map.containsKey(temp)){
                    set.remove(a[i]);
                    set.remove(temp);
                }
            }
        }
        int ans = 0;
        Iterator<Integer> it = set.iterator();
        while (it.hasNext()){
            ans+=map.get(it.next());
        }
        out.print(ans);
        out.flush();
    }
View Code

D:

在点11卡了一会,特别囍的是 点了下记录,当时有5个d题,结果全wa点11。。普通贪心 很好想到,遇到 3的整数倍 或者 0 就拿出来。 另外 能被3 整除的 数 那么它各位数的和一定能被三整除,所以我们可以 用一个 sum来记录

  以下错误想法千万不要看:wa了之后 瞎试出来一组样例 110112,,, 按照我错误的贪心 ,  112 这个数 其实是 没答案的,因为 sum 分别等于 1,2,4,发现这个bug之后就很容易修改了,还是 map 存一下就ok

 public static void main(String[] args) {
        String s = next();
        int n = s.length();
        int a[] = new int[n];
        for(int i=0;i<n;i++){
            a[i] = s.charAt(i)-'0';
        }
        int ans = 0;
        int sum = 0;

        int y[] = new int[3];

        for(int i=0;i<n;i++){
            if (a[i]%3==0){
                y[1]=0;
                y[2]=0;
                sum=0;ans++;
            }else if (a[i]==0){
                y[1]=0;
                y[2]=0;
                sum=0;ans++;
            }else {
                sum+=a[i];

                y[sum%3]++;

                if (sum%3==0){
                    y[1]=0;
                    y[2]=0;
                    sum=0;
                    ans++;
                }else {
                    if (y[sum%3]>1){
                        y[1]=0;
                        y[2]=0;
                        sum=0;
                        ans++;
                    }
                }
            }
        }
        out.print(ans);
        out.flush();
    }
main 方法

E题时间太短了没来得及细想,虽然我觉着细想也做不出来 ,学长们因为今天要考试都没打也没有靠谱的代码能看,先这样吧,话说在家里切题可真舒服,,不开空调一点也不热

猜你喜欢

转载自www.cnblogs.com/MXang/p/9286900.html
今日推荐