2013年10月10日 星期四

UVA-103

UVA-103   Stacking Boxes

這題要注意題意
當兩個邊重疊時也不能算喔
筆者就卡這個卡了一小時多...

#include<iostream>
#include<stdio.h>
#include<algorithm>
int box[31][10],temp[10];
int b,d;
int ans,ansb[31][31],order[31]={0};
int tempb[31],rm;
bool st(int a,int w){
    for(int q=0;q<d;q++)
        if(box[a][q]!=box[w][q])
            return box[a][q]<box[w][q];
    return true;
} 
bool check(int i,int j){
    bool FT=true;
    for(int k=0;k<d;k++)
        if(box[i][k]>=box[j][k]){
            FT=false;
            break;
        }
    return FT;    
}
using namespace std;
int main(){
    while(scanf("%d%d",&b,&d)!=EOF){
        for(int i=1;i<=b;i++){
            order[i]=i;
            for(int j=0;j<d;j++)
                cin>>temp[j];
            sort(temp,temp+d);
            for(int j=0;j<d;j++)
                box[i][j]=temp[j];
        }
        sort(order+1,order+1+b,st);
        ansb[order[1]][0]=order[1];tempb[order[1]]=1;
        for(int i=2;i<=b;i++){
            ansb[order[i]][0]=order[i];tempb[order[i]]=i;
            int max=0;
            for(int j=i-1;j>0;j--)
                if(check(order[j],order[i]))
                    if(tempb[order[j]]>max){
                        rm=j;
                        max=tempb[order[j]];
                    }
            tempb[order[i]]=max+1;
            for(int j=0;j<max;j++)
                ansb[order[i]][j]=ansb[order[rm]][j];
            ansb[order[i]][max]=order[i];
        }
        int mem=1;
        for(int i=2;i<=b;i++)
            mem=(tempb[order[mem]]>tempb[order[i]])?(mem):(i);    
        cout<<tempb[order[mem]]<<'\n';
        for(int i=0;i<tempb[order[mem]];i++)
            printf("%d ",ansb[order[mem]][i]);
        cout<<endl;
    }
return 0;    
}


UVA-102

UVA-102   Ecological Bin Packing

這題搞笑啊..


#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
    long long int can[3][3];
    long long int pos[6],ans;
    while(scanf("%lld%lld%lld%lld%lld%lld%lld%lld%lld",&(can[0][0]),&(can[0][1]),&(can[0][2]),&(can[1][0]),&(can[1][1]),&(can[1][2]),&can[2][0],&can[2][1],&can[2][2])!=EOF){
        pos[1]=can[0][1]*1+can[0][2]*1+can[1][0]*1+can[1][2]*1+can[2][0]*1+can[2][1]*1;
        pos[0]=can[0][1]*1+can[0][2]*1+can[1][0]*1+can[1][1]*1+can[2][0]*1+can[2][2]*1;
        pos[4]=can[0][0]*1+can[0][2]*1+can[1][1]*1+can[1][2]*1+can[2][0]*1+can[2][1]*1;
        pos[5]=can[0][0]*1+can[0][2]*1+can[1][0]*1+can[1][1]*1+can[2][1]*1+can[2][2]*1;
        pos[2]=can[0][0]*1+can[0][1]*1+can[1][1]*1+can[1][2]*1+can[2][0]*1+can[2][2]*1;
        pos[3]=can[0][0]*1+can[0][1]*1+can[1][0]*1+can[1][2]*1+can[2][1]*1+can[2][2]*1;
        ans=pos[0];
        for(int i=1;i<6;i++)
            ans=(ans<pos[i])?(ans):(pos[i]);
        for(int i=0;i<6;i++){
            if(ans==pos[i]){
                switch(i){
                    case 0:
                        cout<<"BCG ";
                        break;
                    case 1:
                        cout<<"BGC ";
                        break;
                    case 2:
                        cout<<"CBG ";
                        break;
                    case 3:
                        cout<<"CGB ";
                        break;
                    case 4:
                        cout<<"GBC ";
                        break;
                    case 5:
                        cout<<"GCB ";
                        break;    
                }
                cout<<pos[i]<<'\n';
                break;
            }
        }
    }
return 0;    
}


完全賣萌030

2013年10月9日 星期三

UVA-101

UVA-101  block problems
這題我無腦亂寫的
純粹貼上來好玩而已
千萬不要學這種爛coding風格..


#include<iostream>
#include<string>
using namespace std;
int main(){
    int blockval[26];
    int stacks[26][26];
    int pile[26],high[26];
    
    int n,a,b,ta,tb,temp,tc,td;
    string temp1,temp2;
    cin>>n;
    for(int i=0;i<n;i++){
        blockval[i]=1;    
        stacks[i][0]=i;
        pile[i]=i;
        high[i]=0;
    }
    while(1){
        cin>>temp1;
        if(temp1=="quit"){
            
            for(int i=0;i<n;i++){
                cout<<i<<":";
                for(int j=0;j<blockval[i];j++){
                    cout<<" "<<stacks[i][j];
                }
            cout<<endl;
            }
        break;
        }
            
        cin>>a>>temp2>>b;
        temp1=temp1+temp2;
        if(a==b || pile[a]==pile[b])
            continue;
        ta=a;tb=b;
        if(temp1=="moveonto"){
            ta=pile[a];tb=high[a];
            tc=pile[b];td=high[b];
            temp=blockval[pile[a]];
            if(pile[a]==pile[b] &&high[a]<high[b]){
                continue;
            }
            for(int i=high[a]+1;i<blockval[pile[a]];i++){
                blockval[stacks[ta][i]]=1;
                pile[stacks[ta][i]]=stacks[ta][i];
                high[stacks[ta][i]]=0;
            }
            for(int i=high[b]+1;i<blockval[pile[b]];i++){
                blockval[stacks[tc][i]]=1;
                pile[stacks[tc][i]]=stacks[tc][i];
                high[stacks[tc][i]]=0;
            }
            pile[a]=pile[b];
            high[a]=high[b]+1;
            stacks[pile[b]][high[a]]=a;
            blockval[ta]=tb;
            blockval[pile[b]]=td+2;
            
        }
        if(temp1=="moveover"){
            ta=pile[a];tb=high[a];
            temp=blockval[pile[a]];
            for(int i=high[a]+1;i<blockval[pile[a]];i++){
                blockval[stacks[pile[a]][i]]=1;
                pile[stacks[pile[a]][i]]=stacks[pile[a]][i];
                high[stacks[pile[a]][i]]=0;
            }
            stacks[pile[b]][blockval[pile[b]]]=a;
            blockval[ta]=tb;
            pile[a]=pile[b];
            high[a]=blockval[pile[b]];
            blockval[pile[b]]+=1;
            //cout<<'\n'<<"pilehigh of "<<pile[a]<<"="<<blockval[pile[a]]<<'\n';
        }
        if(temp1=="pileonto"){
            ta=pile[a];tb=high[a];
            tc=pile[b];td=high[b];
            temp=blockval[pile[a]];
            for(int i=high[b]+1;i<blockval[pile[b]];i++){
                blockval[stacks[tc][i]]=1;
                pile[stacks[tc][i]]=stacks[tc][i];
                high[stacks[tc][i]]=0;
            }
            for(int i=high[a];i<temp;i++){
                high[stacks[ta][i]]=i-tb+high[b]+1;
                stacks[pile[b]][high[stacks[ta][i]]]=stacks[ta][i];
                pile[stacks[ta][i]]=pile[b];
            }
            blockval[ta]=tb;
            blockval[tc]=high[b]+temp-tb+1;
        }
        if(temp1=="pileover"){
            ta=pile[a];tb=high[a];
            temp=blockval[pile[a]];
            if(pile[a]==pile[b] &&high[a]<high[b]){
                continue;
            }
            //cout<<'\n'<<"blockval[pile[a]]="<<blockval[pile[a]]<<", high[a]="<<high[a]<<'\n';
            for(int i=high[a];i<temp;i++){
                high[stacks[ta][i]]=i-tb+blockval[pile[b]];
                //cout<<"high[stacks[ta][i]]="<<high[stacks[ta][i]]<<endl;
                stacks[pile[b]][high[stacks[ta][i]]]=stacks[ta][i];
                pile[stacks[ta][i]]=pile[b];
            }
            blockval[pile[b]]+=temp-tb;
            blockval[ta]=tb;
            //cout<<'\n'<<"pilehigh of "<<pile[b]<<"="<<blockval[pile[b]]<<'\n';
        }
    }

    cin>>temp1;
return 0;    
}



真的亂寫030