【NOIP2010提高组】5.26校模拟

世间唯有暴力与打表不可辜负。

A. 【NOIP 2010 提高组】机器翻译

【NOIP2010提高组】5.26校模拟

【NOIP2010提高组】5.26校模拟

没记错这题在LuoGu刷过,模拟一下就行这东西,毕竟T1(滑稽)

#include<iostream>
#include<queue>
using namespace std;
int m,n;
int Count; 
bool b[1111];
int ans;
queue <int> Q; 
int main(){
    //freopen("translate.in","r",stdin);
    //freopen("translate.out","w",stdout);
    cin>>m>>n;
    int Putin;
    for(int i=1;i<=n;i++){
        cin>>Putin;
        if(b[Putin]){
            
        }
        else{
            ans++;
            if(Count<=m-1){
                b[Putin]=true;
                Count++;
                Q.push(Putin);
            }
            else{
                b[Q.front()]=false;
                Q.pop();
                b[Putin]=true;
                Q.push(Putin);
            }
        }
    }
    cout<<ans;
}

B. 【NOIP 2010 提高组】乌龟棋

【NOIP2010提高组】5.26校模拟

【NOIP2010提高组】5.26校模拟

考场先暴力,不要多BB。

先给我搜他丫的。

 

#include<iostream>
#include<algorithm>
//打表出省一,暴力出奇迹 
using namespace std;
long long Space[5000];
long long Paper[5000];
bool used[5000];
long long n,m;
long long ans;
inline void DFS(long long Score,long long Pos){
    long long mychoice=0;
    Score+=Space[Pos];
    for(long long i=1;i<=m;i++){
        if(used[i]==false){
            used[i]=true;
            mychoice=i;
            DFS(Score,Pos+Paper[i]);
            used[mychoice]=false;
        }
    }
    ans=max(ans,Score);
}
int main(){
    //freopen("tortoise.in","r",stdin);
    //freopen("tortoise.out","w",stdout);
    cin>>n>>m;
    for(long long i=1;i<=n;i++){
        cin>>Space[i];
    }
    for(long long i=1;i<=m;i++){
        cin>>Paper[i];    
    }
    sort(Paper+1,Paper+1+m);
    DFS(0,1);
    cout<<ans;
}

然后搜了个20(多捞哦!!!!不够大力吗??

搜一波LuoGu题解…哇。四维数组。看一眼题目数据范围就懂了,疯狂暗示系列么。

各种出牌方法一个一个折腾,一直取最大值。在输入的时候就把每张手牌的个数存好(有点像背包??)

#include<iostream>
using namespace std;
const int MAXN=50;
//思路来源:洛谷题解。已理解并脱离题解重写 
int Step[500];
int Card[MAXN][MAXN][MAXN][MAXN];
int Number[MAXN];
int n,m;
int main(){
    int Index;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>Step[i];
    }
    for(int i=1;i<=m;i++){
        cin>>Index;
        Number[Index]++;
    }

    Card[0][0][0][0]=Step[1];
    for(int a=0;a<=Number[1];a++){
        for(int b=0;b<=Number[2];b++){
            for(int c=0;c<=Number[3];c++){
                for(int d=0;d<=Number[4];d++){
                if(a!=0)    Card[a][b][c][d]=max(Card[a][b][c][d],Card[a-1][b][c][d]+Step[1+a+b*2+c*3+d*4]);
                if(b!=0)    Card[a][b][c][d]=max(Card[a][b][c][d],Card[a][b-1][c][d]+Step[1+a+b*2+c*3+d*4]);
                if(c!=0)    Card[a][b][c][d]=max(Card[a][b][c][d],Card[a][b][c-1][d]+Step[1+a+b*2+c*3+d*4]);
                if(d!=0)    Card[a][b][c][d]=max(Card[a][b][c][d],Card[a][b][c][d-1]+Step[1+a+b*2+c*3+d*4]);
                }
            }
        }
    }
    cout<<Card[Number[1]][Number[2]][Number[3]][Number[4]];
}

C. 【NOIP 2010 提高组】关押罪犯

【NOIP2010提高组】5.26校模拟

【NOIP2010提高组】5.26校模拟

 

 看到题目画好的图说实话有并查集的想法,但无奈思维还停滞在普及组,觉得应该用不到并查集。于是乎,暴力了…

#include<iostream>
#include<vector> 
using namespace std;
//打表出省一,暴力出奇迹
const int MAXN=20010;
const int INF=1e9;
int n,m;
vector <int> A;
vector <int> B;
int dp[MAXN][MAXN];
int ans;
inline void DFS(int x,int c){
//    for(int i=0;j<A.size();j++){
//        cout<<A[i];
//    }
    if(c>ans){
        return;
    }
    if(x==n+1){
        //cout<<"now the c is "<<c<<endl;
        ans=min(c,ans);
        return;
    }
    int MAXA,MAXB;
    MAXA=MAXB=0;
    for(int j=0;j<A.size();j++){
        MAXA=max(MAXA,dp[x][A[j]]);
    }
    for(int j=0;j<B.size();j++){
        MAXB=max(MAXB,dp[x][B[j]]);
    }
    A.push_back(x);
    DFS(x+1,max(c,MAXA));
    A.pop_back();
    B.push_back(x);
    DFS(x+1,max(c,MAXB));
    B.pop_back();    
}
int main(){
    //freopen("*.in","r",stdin);
//    freopen("*.out","w",stdout);
    cin>>n>>m;
    int x,y,c;
    ans=INF;
    for(int i=1;i<=m;i++){
        cin>>x>>y>>c;
        dp[x][y]=c;
        dp[y][x]=c;
    }
    DFS(1,0);
    cout<<ans;
}

尽管Vector都玩起来了,依然有爆炸现象(当然还有TLE

然后看到LuoGu某大佬天秀思路。把怒气值排序,把敌人的敌人与我关进牢笼。关不进去就是程序终点。完全没有任何毛病并且实现简单清晰明了。

#include<iostream>
#include<algorithm>
using namespace std;
//思路源自洛谷,完全理解并脱离题解重写。 
const int MAXN=20500;
int a[MAXN];
struct relation{
    int *A;
    int *B;
    int FireIndex;
}Ships[100400];
int n,m;
int Enemy[MAXN];
inline int find(int x){
    if(a[x]==x){
        return x;
    }
    a[x]=find(a[x]);
    return a[x];
}
inline bool check(int x,int y){
    if(find(a[x])==find(a[y])){
        return true;
    }
    return false;
}
inline bool Ruler(const relation &a,const relation &b){
    return a.FireIndex>b.FireIndex;
}
inline void merge(int x,int y){
    x=find(a[x]);
    y=find(a[y]);
    a[x]=y;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        a[i]=i;
    }
    for(int i=1;i<=m;i++){
        cin>>Ships[i].*A>>Ships[i].*B>>Ships[i].FireIndex;
    }
    sort(Ships+1,Ships+1+m,Ruler);
    for(int i=1;i<=m+1;i++){
        if(i==m+1){
            cout<<0;
            return 0;
        }
        if(check(Ships[i].*A,Ships[i].*B)){
            cout<<Ships[i].FireIndex;
            return 0;
        }
        else{
            if(Enemy[Ships[i].*A]==0){
                Enemy[Ships[i].*A]=Ships[i].*B;
            }
            else{
                merge(Enemy[Ships[i].*A],Ships[i].*B);
            }
            if(Enemy[Ships[i].*B]==0){
                Enemy[Ships[i].*B]=Ships[i].*A;
            }
            else{
                merge(Enemy[Ships[i].*B],Ships[i].*A);
            }
        }
    } 
} 

Orz…太棒了。

D. 【NOIP 2010 提高组】引水入城

【NOIP2010提高组】5.26校模拟

【NOIP2010提高组】5.26校模拟