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型。

  总结:

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

原文地址:https://www.cnblogs.com/wang3/p/3178902.html