• SRM DIV2 577 EllysRoomAssignmentsDiv2


    算法思路:

    1.统计出人数;
    2.算出房间数k;
    3.计算比Elly大的人数count;
    4. 根据count和k计算概率。
     
    遇到的Bug:
      题意没读清楚,必须把所有的ratings[i]连起来,否则会出问题。
      题意没读清楚,以为会有重复的,所以用了hashMap来标记,但不影响算法正确性。
      count=0的时候,应该返回1。
     
    菜鸟好不容易调试通过的代码:
    import java.util.*;
    import java.util.regex.*;
    import java.text.*;
    import java.math.*;
    
    
    public class EllysRoomAssignmentsDiv2
    {
        public double getProbability(String[] ratings)
        {
            int N,R,count;
            int i;
            String[] strs;
            String lstr = new String();
            String elly = new String();
            HashMap mp = new HashMap();
            
            for(i=0;i<ratings.length;i++){
                lstr+=ratings[i];
            }
            
            strs = lstr.split(" ");
            elly = strs[0];
            
            count=0;
            N=0;
            for(i=0;i<strs.length;i++){
                if(strs[i].length()>0&&!mp.containsKey(strs[i])){
                    mp.put(strs[i],true);
                    N++;
                //    System.out.println(N+",str="+strs[i]);
                }
                if(cmp(strs[i],elly)>0)
                    count++;
            }
            
            //System.out.println(N);
            if(N%20==0)
                R=N/20;
            else
                R=N/20+1;
            
            if(count==0)
                return 1;
            else if(R>count)
                return 0;
            else
                return 1.0/R;
        }
        
        private int cmp(String str1,String str2){
            if(str1.length()!=str2.length())
                return str1.length() - str2.length();
            else
                return str1.compareTo(str2);
        }
    }
    //Powered by KawigiEdit 2.1.4 (beta) modified by pivanof!

    Java大神的代码:

    import java.util.*;
    import java.util.regex.*;
    import java.text.*;
    import java.math.*;
    import java.awt.geom.*;
     
    public class EllysRoomAssignmentsDiv2
    {
      public double getProbability(String[] ratings)
      {
        StringBuilder sb=new StringBuilder();
        for(String s:ratings)sb.append(s);
        
        String[]str=sb.toString().split(" ");
        int[]rat=new int[str.length];
        for(int i=0;i<rat.length;i++){
          rat[i]=Integer.parseInt(str[i]);
        }
        int el=rat[0];
        
        
        
        int n=rat.length;
        Arrays.sort(rat);
        
        int num=-1;
        
        for(int i=n;i-->0;){
          if(rat[i]==el){
            num=n-i;
            break;
          }
        }
        
        int r=0;
        if(n%20==0){
          r=n/20;
        }else{
          r=n/20+1;
        }
        
        
        //System.out.println(num);
        if(r==1)return 1.0;
        if(num==1)return 1.0;
        if(num>r){
          return (double)1/r;
        }else return 0.0;
      }
      
      
    }
    //Powered by [KawigiEdit] 2.0!

    C++大神的代码:

    #include <algorithm>
    #include <cassert>
    #include <sstream>
    #include <vector>
    #include <string>
    #include <iostream>
    using namespace std;
     
    class EllysRoomAssignmentsDiv2
    {
    public:
     
    double getProbability(vector <string> ratings)
    {
      string rating;
      for (int i = 0; i < ratings.size(); ++i)
        rating += ratings[i];
      istringstream iss(rating);
      vector<int> regs;
      int member;
      while (iss >> member) regs.push_back(member);
      int elly = regs[0];
      sort(regs.begin(), regs.end(), greater<int>());
      if (regs[0] == elly) return 1.0;
     
      int pos = 0;
      for (; pos < regs.size() && regs[pos] > elly; ++pos) ;
      assert(regs[pos] == elly);
      int N = regs.size();
      int R = (N + 19) / 20; cout << N << ' ' << R << endl;
     
      if (pos < R) return 0.0;
      
      return 1.0 / R;
    }
     
    };

    分析:

      算法:Simple Math, Sorting, String Parsing

      对比:

        1.大神的算法都差不多。

        2.C++大神的这句用得好:R = (N + 19) / 20;

        3.因为没有读清楚题,我的算法可以处理任意长度的字符串,不用转化为int型。

      总结:

        算法挺简单,但是因为我没有认真读题,导致犯了不少错误,调试花了不少时间。

  • 相关阅读:
    js的原型链
    setTimeout浅析
    并行模式库PPL应用实战(一):使用task类创建并行任务
    PC客户端开发细节记录:保存GUID到VARIANT
    UWP开发细节记录:DirectX::XMMATRIX 的坑
    UWP开发细节记录:WRL::ComPtr 的坑
    UWP开发细节记录:IStream 和 IRandomAccessStream^ 以及 IMFByteStream 互转
    UWP开发细节记录:判断文件类型
    UWP开发细节记录:加载图像文件到D2D位图和D3D纹理
    基于纤程(Fiber)实现C++异步编程库(一):原理及示例
  • 原文地址:https://www.cnblogs.com/wang3/p/3178902.html
Copyright © 2020-2023  润新知