2015年1月29日 星期四

TIOJ 1113 [入門] Evanesco

#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <algorithm>
using namespace std;
int main(){
    char s[10];
    while(scanf("%s",s) != EOF){
        int l = strlen(s);
        sort(s, s+l);
        do {
            printf("%s\n", s);
        } while ( next_permutation(s, s + l) );
        puts("");
    }
}

TIOJ 1101 D.分「樹」

#include <cstdio>
#include <cstdlib>
using namespace std;

struct node{
    int up, down;
};

node add(const node a, const node b){
    node c;
    c.up = a.up + b.up;
    c.down = a.down + b.down;
    return c;
}

int main(){
    int n, m;
    while(1){
        scanf("%d %d",&n, &m);
        if(n + m == 0){break;}
        if(n == 1){
            if (m == 1){ printf("0/1\n"); }
            if (m == 2){ printf("1/0\n"); }
            continue;
        }

        node l, r, mid;
        l.up = 0;  l.down = 1;
        r.up = 1;  r.down = 0;

        int l_num = 0, r_num = 1 << (n-2), mid_num;
        for(int i = 1; i < n-1; i++){
            mid = add(l, r);
            mid_num = (l_num + r_num)/2;
            if(m <= mid_num){
                r = mid;
                r_num = mid_num;
            }
            else{
                l = mid;
                l_num = mid_num;
            }
        }
        
        mid = add(l, r);

        printf("%d/%d\n", mid.up, mid.down);
    }
}

2015年1月28日 星期三

TIOJ 1082 C.分堆問題

#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define ll long long
ll a[1000002],b[1000002];
int main(){
    int n;
    while(true){
        scanf("%d",&n);
        if(n==0)
            break;
        int black=0,white=0;
        ll all_b=0,all_w=0;
        ll minus=2147483647;
        int site;
        ll ans=0;
        if(n==1){
            scanf("%lld %lld",&a[0],&b[0]);
            if(a[0]==0 || b[0]==0)
                printf("0\n");
            else
                printf("-1\n");
            continue;
        }
        for(int i=0;i<n;i++){
            scanf("%lld %lld",&a[i],&b[i]);
            all_w+=b[i];
            all_b+=a[i];
            if(a[i]>b[i]){
                black++;
                ans+=b[i];
            }
            else{
                white++;
                ans+=a[i];
            }
            ll t=abs(a[i]-b[i]);
            if(t<minus){
                minus=t;
                site=i;
            }
        }
        if(black==0 || white==0)
            ans+=minus;    
        printf("%lld\n",ans);

    }
}

TIOJ 1048 D.亞洲經濟合作會議

#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int pp[15];
bool flag[15];
char ans[15];
int n,m;
char al(int x){
    int cnt=0;
    int i=0;
    for(i=0;i<n;i++){
        if(flag[i]&&cnt==x)
            break;
        if(flag[i])
            cnt++;
    }
    flag[i]=false;
    return i+65;
}
int main(){
    pp[0]=1;  
    pp[1]=1;
    for(int i=2;i<=12;i++)
        pp[i]=pp[i-1]*i;
    while(true){
        scanf("%d %d",&n,&m);
        if(n==0&&m==0)
            break;
        m--;
        m%=pp[n];
        for(int i=0;i<15;i++)
            flag[i]=true;
        
        for(int i=0;i<n;i++){
            int mm=m/pp[n-1-i];
            m%=pp[n-1-i];
            ans[i]=al(mm);
        }
        ans[n]='\0';
        for(int i=0;i<n-1;i++)
            printf("%c ",ans[i]);
        printf("%c\n",ans[n-1]);
    }
}

TIOJ 1040 C.連分數

#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;

std::vector<int> ans;
void gcd(int &x,int &y){
    int t,xx=x,yy=y;
    while(yy!=0){
        xx%=yy;
        int tt=xx;
        xx=yy;
        yy=tt;
    }
    x/=xx;
    y/=xx;
    return;
}
void ff(int n,int m){
    int tans=n/m;
    printf("%d",tans);
    n%=m;
    gcd(n,m);
    if(n==1){
        printf("+1/%d",m);
        return;
    }
    if(n==0)
        return;
    printf("+1/{");
    ff(m,n);
    printf("}");
}
int main(){
    int T;
    int n,m;
    scanf("%d",&T);
    while(T-->0){
        ans.clear();
        scanf("%d %d",&n,&m);
        printf("%d/%d = ",n,m);
        ff(n,m);
        printf("\n");
    }
}

TIOJ 1020 F.Number Insertion

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;
int n;
int num;
vector<int> v, ans;
bool compare(){
    for (int i = 0; i < n+1; ++i){
        if(v[i] != ans[i])
            return v[i] > ans[i];
    }
    return false;
}

void dfs(int x){
    if (x > n){
        if(compare())
            ans = v;
        num++;
        return;
    }
    for(int i = 1; i < x ;++i){
        if( x % (v[i-1] + v[i]) == 0 ){
            v.insert(v.begin()+i, x);
            dfs(x+1);
            v.erase(v.begin()+i);
        }
    }
}
int main(){
    scanf("%d",&n);
    v.push_back(0);
    v.push_back(1);
    num = 0;
    for (int i = 0; i <= n; ++i)
        ans.push_back(0);
    dfs(2);
    printf("%d\n",num);
    for (int i = 0; i < n; ++i){
        printf("%d ",ans[i]);
    }
    printf("%d\n",ans[n]);
}

TIOJ 1007 燈泡問題

#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main() {
    int n,m;
    long long int dp[2][17];
    scanf("%d %d",&n,&m);
    int now = 0,pre = 1;
    for (int i = 0; i < n+1; ++i)
       dp[now][i] = 1;
    dp[now][n+1] = 0;
    for(int k = 0; k < m; k++){
        swap(now, pre);
        dp[now][n+1] = 0;
        for (int i = 0; i <= n; ++i)
            dp[now][i] = dp[pre][i+1] + dp[pre][0];
        
    }
    printf("%lld\n",dp[now][0]);
    return 0;
}