You are on page 1of 7

//Training 3:CBUS

#include<bits/stdc++.h>

#include<iostream>

using namespace std;

const int N=12;

const int M=N *2;

int c[M][M];

int n, k;

int m;

map< pair<int, int> , int > memo[M];

int CBUS(int u ,int up , int down){

if(memo[u].count(make_pair(up,down))){

return memo[u][make_pair(up, down)];

if(__builtin_popcount(down)==n){

return memo[u][make_pair(up, down)]=c[u][0];

int res=INT_MAX;

if(__builtin_popcount(up) < k){

for(int v=1; v<=n;++v){


if(!(up>> (v-1)&1)&& !(down >> (v-1)&1)){

res=min(res,c[u][v]+CBUS(v,up|(1<<(v-1)),down));

for(int v=n+1; v<=m;++v){

if(up>>(v-n-1)&1){

res=min(res, c[u][v]+CBUS(v,up^(1<<(v-n-1)),down|(1<<(v-n-
1))));

return memo[u][make_pair(up, down)]=res;

int main(){

cin>>n>>k;

m=n*2;

for(int i=0;i<=m;++i)

for(int j=0;j<=m;++j){

cin>>c[i][j];

}
cout<<CBUS(0,0,0)<<endl;

return 0;

//TRAINING 3: TAXI

#include<bits/stdc++.h>

#include<iostream>

using namespace std;

const int N=12;

const int M=N *2;

int c[M][M];

int n,k=1;

int m;

map< pair<int, int> , int > memo[M];

int CBUS(int u ,int up , int down){

if(memo[u].count(make_pair(up,down))){

return memo[u][make_pair(up, down)];

if(__builtin_popcount(down)==n){

return memo[u][make_pair(up, down)]=c[u][0];

}
int res=INT_MAX;

if(__builtin_popcount(up) < k){

for(int v=1; v<=n;++v){

if(!(up>> (v-1)&1)&& !(down >> (v-1)&1 )){

res=min(res,c[u][v]+CBUS(v,up|(1<<(v-1)),down));

for(int v=n+1; v<=m;++v){

if(up>>(v-n-1)&1){

res=min(res, c[u][v]+CBUS(v,up^(1<<(v-n-1)),down|(1<<(v-n-
1))));

return memo[u][make_pair(up, down)]=res;

int main(){

cin>>n;

m=n*2;

for(int i=0;i<=m;++i)
for(int j=0;j<=m;++j){

cin>>c[i][j];

cout<<CBUS(0,0,0)<<endl;

return 0;

//Training 4: PIE

#include <bits/stdc++.h>

using namespace std;

#define MAXT 10000

#define MAXN 10001

#define pi 3.141592653589793238

int T, N, F, r[MAXN] = { };

double result[MAXT] = { };

int main() {

scanf("%d", &T);

int i = -1;
while (++i < T) {

scanf("%d %d", &N, &F);

int j = -1;

double sum = 0;

while (++j < N) {

scanf("%d", &r[j]);

sum += r[j] * r[j];

sum *= pi;

double high = sum / (double) (F + 1);

double low = 0;

double V, epsilon = 10e-8;

while (high - low > epsilon) {

V = (low + high) / 2;

j = -1;

sum = 0;

while (++j < N) {

sum += (int) (pi * r[j] * r[j] / V);

if (sum < F + 1) {

high = V;

continue;

} else {
low = V;

continue;

result[i] = (low + high) / 2;

i = -1;

while (++i < T) {

printf("%.6f\n", result[i]);

return 0;

You might also like