顾小丰


私信TA

用户名:dotcpp0662778

访问量:1614

签 名:

等  级
排  名 21930
经  验 663
参赛次数 0
文章发表 2
年  龄 0
在职情况 学生
学  校 电子科技大学
专  业

  自我简介:

TA的其他文章

填充--贪心算法
浏览:964

解题思路:
当我们从头遍历时,要明白一点是,不要考虑前面的位置,有点动态规划的想法,即前面做的已经是最对的了,前面已经把当前的考虑进去了(代码有所体现),所以我们只考虑当前位置及以后。

当前位置只能影响我们的下一位置,影响不到下下位置

理由:因为当我们认为我们当前位置可以影响到下一位置时,潜意识里就认为,可能我们放弃当前位置组成字串时,后面可以组成更多的字串,但事实并不是这样,

当前位置放弃后,顶多会使我们的下一位置与下下位置组成字串,即多一个字串,那既然要多一个字串,为什么我们不利用当前字符,而是选择下一个呢?

注意事项:

参考代码:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.*;

public class Main {
   public static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   public static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
   public static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
   public static PrintWriter count = new PrintWriter(new OutputStreamWriter(System.out));

   public static void main(String[] args) throws Exception {
       String s = Line();
       //遇到?在进行操作即可 首先我们要明白 一个数只能存在一个字串里面 不能在两个字串扮演角色
       //那会不会出现这样的 1?00001 这种 假如我们选择?为1 有三个字串 选择?为0 却只有两个
       //选择贪心算法 优先匹配第一个即可 因为你选择不匹配第一个就意味着你丢弃了一个字符串 除非你丢弃的结果是你可以凑出来两个 不可能嘛
       int sum = 0;
       for (int i = 0; i < s.length() - 1; i++) {
           //我只担心我的下一个
           char c = s.charAt(i);
           if (c == '1') {
               char cc = s.charAt(i + 1);
               if (cc == '1' || cc == '?') {
                   sum++;
                   i++;
                   //这个数不再考虑
               }
           } else if (c == '0') {
               char cc = s.charAt(i + 1);
               if (cc == '0' || cc == '?') {
                   sum++;
                   i++;
                   //这个数不再考虑
               }
           } else if (c == '?') {
               //优先凑成
               sum++;
               i++;
           }
       }
       count.print(sum);
       closeAll();
   }

   public static int nextInt() throws Exception {
       cin.nextToken();
       return (int) cin.nval;
   }

   public static long nextLong() throws Exception {
       cin.nextToken();
       return (long) cin.nval;
   }

   public static double nextDouble() throws Exception {
       cin.nextToken();
       return cin.nval;
   }

   public static String nextString() throws Exception {
       cin.nextToken();
       return cin.sval;
   }

   public static String Line() throws Exception {
       String p = "";
       p = in.readLine();
       return p;
   }

   public static void closeAll() throws Exception {
       count.close();
       in.close();
       out.close();
   }
}

 

0.0分

7 人评分

  评论区

  • «
  • »