nikeeshi のコーディング記

コーディングの成果をはっつけるとこ。このブログにあるソースコードはNYSL Version 0.9982に従い公開します(2014/06/18)。

SRM628Div1

Easy

TLEで落としました。遅いコードを書きすぎてしまった。 一応落ちたコードですが、載せておきます。

#include <vector>
#include <cmath>
#include <iostream>
using namespace std;
class DivisorsPower
{
public:
    long long powint(long long x,long long y){
        long long ret=1;
        for(int i=0;i<y;i++)
            ret*=x;
        return ret;
    }
    long long root(long long x,long long y){
        long long ret=pow(x,1/(long double)y);
        if(powint(ret,y)==x)return ret;
        if(powint(ret,y)>x)return ret-1;
        else return ret+1;
    }
    long long d(long long x){
        int ret=0;
        for(int i=1;i<sqrt(x);i++){
            if(x%i==0)ret+=2;
        }
        int sqrtx=sqrt(x);
        if(x==sqrtx*sqrtx)
        if(x%(int)sqrt(x)==0)ret++;
        return ret;
    }
    long long findArgument(long long n){
        long long maxk=ceil(log2(n));
        for(long long k=maxk;k>=1;k--){
            long long x=root(n,k);
            cout<<k<<"\t"<<x<<endl;
            if(powint(x,k)==n&&d(x)==k)
                return x;
        }
        return -1;
    }
};

Medium

Div1で初めて解けたMediumです。 パーズして最大のXの個数をカウントして、候補をソートして、順番につめるだけ。

#include <vector>
#include <string>
#include <utility>
#include <algorithm>
#include <functional>
Using namespace std;
Class CircuitsConstruction
{
Public:
    string circuit;
    //count,length
    pair<int,int> calc(int top){
        if(circuit[top]=='A')
        {
            auto c1=calc(top+1);
            auto c2=calc(c1.second+top+1);
            return make_pair(c1.first+c2.first,c1.second+c2.second+1);
        }
        else if(circuit[top]=='B')
        {
            auto c1=calc(top+1);
            auto c2=calc(c1.second+top+1);
            return make_pair(max(c1.first,c2.first),c1.second+c2.second+1);
        }
        else
        {
            return make_pair(1,1);
        }
    }
    int maximizeResistance(string strcircuit, vector <int> conductors) {
        circuit=strcircuit;
        sort(conductors.begin(),conductors.end(),greater<int>());//おっきいじゅん
        auto xcount=calc(0).first;
        int ret=0;
        for(int i=0;i<xcount;i++){
            ret+=conductors[i];
        }
        return ret;
    }
};