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;
}
};