SRM 537 DIV2

前几天抽空做了下SRM537的DIV2(没办法,完全靠自己搞不掉DIV1的3个题,特别是1000。。一般只有仰慕的份。。还是要多练,多思考),一直没抽出时间写解题报告,今天写一下吧。

250:注意名字长度必须为8,其他的没什么。。

public class KingXNewBaby{
private boolean Yes(char c){
if(c=='a' || c=='e' || c=='i' || c=='o' || c=='u')
return true;
else return false;
}
public String isValid(String name){
int ct = -1;
char [] c = new char[2];
if(name.length() != 8) return "NO";
for(int i = 0; i < name.length(); i++){
if(Yes(name.charAt(i))){
++ct;
if(ct > 1) return "NO";
else c[ct] = name.charAt(i);
}
}
if(ct==1 && c[0]==c[1]) return "YES";
else return "NO";
}
}

550:注意到如果x和y的组合可以整除A也可以整除B,那么x和y的组合可以整除任意A和B的线性组合。

public class KingXNewCurrency{
public int howMany(int A, int B, int X){
int ans = 0;
boolean flag1, flag2;
if(X<=A && X<=B && A%X==0 && B%X==0) return -1;
for(int i = 1; i <= 200; i++){
flag1 = flag2 = false;
for(int j = 0; j <= 200; j += X)
for(int k = 0; k <= 200; k += i){
if(j+k == A) flag1 = true;
if(j+k == B) flag2 = true;
}
if(flag1 && flag2 && i!=X) ans++;
}
return ans;
}
}

950:

概率题很多都这样,看起来怪吓人的,但是实际上仔细算一下、推一下(有时候需要点灵感和直觉),写起代码来其实很轻松。

如果把需求关系画成一个图的话,可以用递推的思想来解。假设一需求顺序为a->b->c,那么a无论如何肯定可以被吃掉,其概率为1,而b被吃掉的可能性是1/2,那c被吃掉的概率为啥呢?——考察排列可以发现,概率为1/A(3,3),即1/(3!)。所以针对每个节点所需要的前驱点构成的链的长度来推算概率,继而求出期望。注意环的情况——环内任何一个节点都不能吃掉。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
#include <cmath>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;

class PrinceXToastbook{
public:
double eat(vector <int> pre){
int n = pre.size();
double ans = 0.0;
for(int i = 0; i < n; i++){
if(pre[i] == -1) ans += 1.0;
else{
int len = 1, j = i;
while(pre[j]!=-1 && len<55){
len++;
j = pre[j];
}
if(len < 55){
double tmp = 1.0;
for(int j = 1; j <= len; j++) tmp *= j;
ans += 1.0/tmp;
}
}
}
return ans;
}
};

 


 

 

 

posted on 2012-03-21 23:55  Moon_1st  阅读(365)  评论(0编辑  收藏  举报

导航