Life of xhu

About

一些 & HOJ_1458 & HOJ_1459

Mar 15, 2014

  |   #C++   |   #HOJ
  1. 在C++中,setw默认是右对齐,如果需要左对齐的话,不是使用负数,而是使用left关键字:

    #include <iomanip>
    cout << left << setw(10) << output << endl;  //占10个字符的位置并左对齐
    
  2. setprecision如果不使用fixed关键字,就是保留总共的位数,如果使用,就是精确到小数点之后的位数。

  3. Ruby的Array.new(i, object),前面是数组大小,后面则是数组元素的初始值,当然不设置初始值也是可以的,比如,如果要建立一个16*16的二维数组,可以使用如下语句:

    test = Array.new(16, Array.new(16))
    

1458:就是根据不同队伍之间的获胜概率,计算每一支队伍得到总冠军的概率,思路就不说了,大致解释一下代码,final8是进入四分之一决赛的概率,final4是进入半决赛的概率,同理,final2final1是进入决赛和夺冠的概率,输出一个队的夺冠概率时一直向上调用就好了。

代码如下:

#include <iostream>
#include <iomanip>
using namespace std;
string name[16];
double match[16][16];

double final8(int i){
    double tmp1 = i % 2 ? match[i][i - 1] / 100.0 : match[i][i + 1] / 100.0;
    return tmp1;
}

double final4(int i){
    double tmp1, tmp2;
    int tmp3 = i / 4;
    tmp1 = i % 4 <= 1 ? final8(tmp3 * 4 + 2) * match[i][tmp3 * 4 + 2] / 100.0 + final8(tmp3 * 4 + 3) * match[i][tmp3 * 4 + 3] / 100.0 : final8(tmp3 * 4) * match[i][tmp3 * 4] / 100.0 + final8(tmp3 * 4 + 1) * match[i][tmp3 * 4 + 1] / 100.0;
    tmp2 = final8(i) * tmp1;
    return tmp2;
}

double final2(int i){
    double tmp1 = 0, tmp2;
    int tmp3 = i / 8;
    if(i % 8 <= 3){
        for(int j = 4; j <= 7; j++)
            tmp1 += final4(tmp3 * 8 + j) * match[i][tmp3 * 8 + j] / 100.0;
    }else{
        for(int j = 0; j <= 3; j++)
            tmp1 += final4(tmp3 * 8 + j) * match[i][tmp3 * 8 + j] / 100.0;
    }
    tmp2 = final4(i) * tmp1;
    return tmp2;
}

double final1(int i){
    double tmp1 = 0, tmp2;
    if(i % 16 <= 7){
        for(int j = 8; j <= 15; j++)
            tmp1 += final2(j) * match[i][j] / 100.0;
    }else{
        for(int j = 0; j <= 7; j++)
            tmp1 += final2(j) * match[i][j] / 100.0;
    }
    tmp2 = final2(i) * tmp1;
    return tmp2;
}

int main(){
    for(int i = 0; i < 16; i++)
        cin >> name[i];
    for(int i = 0; i < 16; i++){
        for(int j = 0; j < 16; j++)
            cin >> match[i][j];
    }
    for(int i = 0; i < 16; i++){
        cout << left << setw(11) << name[i];
        cout << "p=" << fixed << setprecision(2) << final1(i) * 100.0 << '%' << endl;
    }
}

1459:就是输入一个偶数,判断是不是两个素数的和,本来打算用筛法做,但是TLE了,后来干脆判断每一个数,居然0.64s过了,看来对于不同的问题,也对挑好方法,毕竟术业有专攻啊。

代码如下:

#include <iostream>
using namespace std;

bool is_prime(int num){
    for(int i = 2; i * i <= num; i++){
        if(num % i == 0)
            return false;
    }
    return true;
}

int main(){
    int n, has_result;
    while(cin >> n && n != 0){
        has_result = 0;
        for(int i = 3; i <= n / 2; i += 2){
            if(is_prime(i) && is_prime(n - i)){
                cout << n << " = " << i << " + " << n - i << endl;
                has_result = 1;
                break;
            }
        }
        if(!has_result)
            cout << "Goldbach's conjecture is wrong." << endl;
    }
}