USACO19DEC题解

Bronze

A Cow Gymnastics

题目:https://www.luogu.com.cn/problem/P5831
题解:用数组存一下出现位置,O(n^2)枚举一下就好。
代码:

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define F(x,y,z) for(re x=y;x<=z;x++)
#define FOR(x,y,z) for(re x=y;x>=z;x--)
#define I inline void
#define IN inline int
typedef long long ll;
I read(int &res){
    re g=1;register char ch=getchar();res=0;
    while(!isdigit(ch)){
        if(ch=='-')g=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        res=(res<<3)+(res<<1)+(ch^48);
        ch=getchar();
    }
    res*=g;
}
int n,m,a[100][100],b[100][100],sn,ans;
int main(){
    freopen("gymnastics.in","r",stdin);
    freopen("gymnastics.out","w",stdout);
    read(m);read(n);
    F(i,1,m){
        F(j,1,n){
            read(a[i][j]);
            b[i][a[i][j]]=j;
        }
    }
    F(i,1,n-1){
        F(j,i+1,n){
            sn=1;
            if(b[1][i]>b[1][j]){
                F(k,2,m)
                    if(b[k][i]<b[k][j]){
                        sn=0;
                        break;
                    }
            }
            else{
                F(k,2,m){
                    if(b[k][i]>b[k][j]){
                        sn=0;
                        break;
                    }
                }
            }
            ans+=sn;
        }
    }
    cout<<ans;
    return 0;
}

B Where Am I?

题目:https://www.luogu.com.cn/problem/P5832
题解:枚举一下K,哈希一下用map一存就行。复杂度:O(n^2)
代码:

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define F(x,y,z) for(re x=y;x<=z;x++)
#define FOR(x,y,z) for(re x=y;x>=z;x--)
#define I inline void
#define IN inline int
typedef long long ll;
I read(int &res){
    re g=1;register char ch=getchar();res=0;
    while(!isdigit(ch)){
        if(ch=='-')g=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        res=(res<<3)+(res<<1)+(ch^48);
        ch=getchar();
    }
    res*=g;
}
const int Mod=1e9+7,bas=131;
set<int>mp;
char c[110];
int n,m,a[110],j,s;
int main(){
    freopen("whereami.in","r",stdin);
    freopen("whereami.out","w",stdout);
    read(n);
    scanf("%s",c+1);
    F(i,1,n){
        a[i]=c[i]-'A'+1;
    }
    F(len,1,n){
        mp.clear();m=1;
        F(i,1,n-len+1){
            j=i+len-1;s=0;
            F(k,i,j){
                s=(ll)s*bas%Mod;
                s+=a[k];
            }   
            if(mp.count(s)){
                m=0;
                break;
            }
            mp.insert(s);
        }
        if(m){
            cout<<len;
            return 0;
        }
    }
    return 0;
}

C Livestock Lineup

题目:https://www.luogu.com.cn/problem/P5833
题解:按字典序爆搜即可。当然,我写的比较麻烦,
建了图,还要用每个点的度数分类讨论,其实复杂度
还是一样,O(8!*8)
代码:

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define F(x,y,z) for(re x=y;x<=z;x++)
#define FOR(x,y,z) for(re x=y;x>=z;x--)
#define I inline void
#define IN inline int
typedef long long ll;
I read(int &res){
    re g=1;register char ch=getchar();res=0;
    while(!isdigit(ch)){
        if(ch=='-')g=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        res=(res<<3)+(res<<1)+(ch^48);
        ch=getchar();
    }
    res*=g;
}
string s[9]={"0","Beatrice","Belinda","Bella","Bessie","Betsy","Blue","Buttercup","Sue"};
char c[100];
int n,m,a[10][10],x,y,du[10],ans[10],v[10];
I D_1(int x){
/*  cout<<x<<" ";
    F(i,1,x){
        cout<<ans[i]<<" ";
    }
    cout<<endl;*/
    if(x==9){
        if(du[ans[x-1]]==2)return;
        F(i,1,8){
            cout<<s[ans[i]]<<endl;
        }
        exit(0);
    }
    re sn=0;
    if(du[ans[x-1]]>=1){
        F(i,1,8){
            if(a[ans[x-1]][i]&&!v[i]){
                sn++;
            }
        }
        if(sn==2)return;
        sn=1;
        F(i,1,8){
            if(a[ans[x-1]][i]&&!v[i]){
                ans[x]=i,v[i]=1,D_1(x+1),v[i]=0;sn=0;   
                break;
            }
        }
        if(!sn)return;
    }
    F(i,1,8){
        if(v[i])continue;
        ans[x]=i,v[i]=1,D_1(x+1);
        ans[x]=0;v[i]=0;
    }
}
int main(){
    freopen("lineup.in","r",stdin);
    freopen("lineup.out","w",stdout);
    read(n);
    memset(a,0,sizeof(a));
    memset(du,0,sizeof(du));
    F(i,1,n){
        cin>>c+1;
        m=strlen(c+1);
        if(m==3)x=8;
        if(m==4)x=6;
        if(m==6)x=4;
        if(m==7)x=2;
        if(m==8)x=1;
        if(m==9)x=7;
        if(m==5){
            if(c[3]=='l')x=3;
            else x=5;
        }
        cin>>c+1>>c+1>>c+1>>c+1>>c+1;
        m=strlen(c+1);
        if(m==3)y=8;
        if(m==4)y=6;
        if(m==6)y=4;
        if(m==7)y=2;
        if(m==8)y=1;
        if(m==9)y=7;
        if(m==5){
            if(c[3]=='l')y=3;
            else y=5;
        }
        du[x]++;du[y]++;
        a[x][y]=1;a[y][x]=1;
        //cout<<x<<" "<<y<<endl;
    }
    F(i,1,n){
        if(du[i]<2){
            ans[1]=i;v[i]=1;
            D_1(2);v[i]=0;
        }
    }
    //cout<<"!";
    return 0;
}

Silver

A MooBuzz

题目:https://www.luogu.com.cn/problem/P5834
题解:可以明显看出,每15次,有8个数被报出来。
随便写写就过了
代码:

B Meetings

题目:https://www.luogu.com.cn/problem/P5835
题解:相信这道题的两个套路大家应该都见过:
1.不管这些牛怎么走,他们的相对位置都是不变的(没见过的一定要细细斟酌)
2.两头牛相遇后,可以看做是“擦肩而过”,也就是并没有改变方向。所以,
我们可以直接算出每头牛走到终点的时间。
知道了这两个性质,做法就顺水推舟了:
1.用类似归并排序的方法算出时刻T,由性质1,我们对时间和重量做出贡献的并不是一头牛(一定要小心);

猜你喜欢

转载自www.cnblogs.com/Purple-wzy/p/12073907.html