NOIP2016 Day1

T1

簡單模擬
分值:100

CODE

#include<cstdio>
#define FOR(i,a,b) for(int i=(a),i##_END_=(b);i<=i##_END_;i++)
#define N 100005
int w[N],q[N],num[N];
char name[N][15];
int main() {
    freopen("toy.in","r",stdin);
    freopen("toy.out","w",stdout);
    long long m,n,k=1;
    scanf("%lld %lld",&m,&n);
    FOR(i,1,m)scanf("%d%s",&w[i],name[i]);
    FOR(i,1,n)scanf("%d%d",&q[i],&num[i]);
    FOR(i,1,n) {
        if(w[k]==q[i])k=(k-num[i])%m;
        else k=(k+num[i])%m;
        if(k<=0)k+=m;
    }
    printf("%s\n",name[k]);
    return 0;
}

T2

瘋狂切分
分值:80

CODE

#include<cstdio>
#include<memory.h>
#include<vector>
#define pb push_back
#define ll long long
using namespace std;
inline void Min(int &x,int y){if(x==-1||x>y)x=y;}
inline void Max(int &x,int y){if(x==-1||x<y)x=y;}

const int N1=1012;
int n,m;
struct P1{
    int fa[N1],ans[N1],W[N1];
    vector<int>E[N1];
    void dfs(int x,int f){
        fa[x]=f;
        for(int i=0;i<(int)E[x].size();i++){
            int V=E[x][i];
            if(V==f)continue;
            dfs(V,x);
        }
    }
    void solve(){
        for(int i=1;i<=n;i++)ans[i]=0;
        for(int i=1;i<=n-1;i++){
            int u,v;
            scanf("%d %d",&u,&v);
            E[u].pb(v);
            E[v].pb(u);
        }
        for(int i=1;i<=n;i++)scanf("%d",&W[i]);
        for(int i=1;i<=m;i++){
            int s,t;
            for(int i=1;i<=n;i++)fa[i]=0;
            scanf("%d %d",&s,&t);
            dfs(s,0);
            int x=t,Tim=0;
            while(x){
                Tim++;
                x=fa[x];
            }
            x=t;
            while(x){
                Tim--;
                if(Tim==W[x])ans[x]++;
                x=fa[x];
            }
        }
        for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
    }
}P25;
const int N2=1e5+20;
struct P2{
    vector<int>E[N2];
    int ans[N2],W[N2];
    void solve(){
        for(int i=1;i<=n;i++)ans[i]=0;
        for(int i=1;i<=n-1;i++){
            int u,v;
            scanf("%d %d",&u,&v);
        }
        for(int i=1;i<=n;i++)scanf("%d",&W[i]);
        for(int i=1;i<=m;i++){
            int s,t;
            scanf("%d %d",&s,&t);
            if(s==t)if(W[s]==0)ans[s]--;
            E[s].pb(t);
        }
        for(int i=1;i<=n;i++){
            int pos=i-W[i];
            if(pos>=1)
                for(int j=0;j<(int)E[pos].size();j++){
                    int V=E[pos][j];
                    if(V>=i)ans[i]++;
                }
            pos=i+W[i];
            if(pos>n) continue;
            for(int j=0;j<(int)E[pos].size();j++){
                int V=E[pos][j];
                if(V<=i)ans[i]++;
            }
        }
        for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
    }
}Plink;
struct P3{
    vector<int>E[N2];
    int sz[N2],ans[N2],W[N2];
    void dfs(int x,int f,int dep){
        for(int i=0;i<(int)E[x].size();i++){
            int V=E[x][i];
            if(V==f) continue;
            dfs(V,x,dep+1);
            sz[x]+=sz[V];
        }
        if(dep==W[x])ans[x]=sz[x];
    }
    void solve(){
        for(int i=1;i<=n;i++)ans[i]=0;
        for(int i=1;i<=n-1;i++){
            int u,v;
            scanf("%d %d",&u,&v);
            E[u].pb(v);
            E[v].pb(u);
        }
        for(int i=1;i<=n;i++)scanf("%d",&W[i]);
        for(int i=1;i<=m;i++){
            int s,t;
            scanf("%d %d",&s,&t);
            sz[t]++;
        }
        dfs(1,0,0);
        for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
    }
}Sequ1;
struct P4{
    vector<int>E[N2];
    int sz[N2],dep[2*N2],ans[N2],W[N2];
    void dfs(int x,int f,int dis){
        ans[x]-=dep[dis+W[x]];
        dep[dis]+=sz[x];
        for(int i=0;i<(int)E[x].size();i++){
            int V=E[x][i];
            if(V==f) continue;
            dfs(V,x,dis+1);
        }
        ans[x]+=dep[dis+W[x]];
    }
    void solve(){
        for(int i=1;i<=n;i++) ans[i]=0;
        for(int i=1;i<=n-1;i++){
            int u,v;
            scanf("%d %d",&u,&v);
            E[u].pb(v);
            E[v].pb(u);
        }
        for(int i=1;i<=n;i++)scanf("%d",&W[i]);
        for(int i=1;i<=m;i++){
            int s,t;
            scanf("%d %d",&s,&t);
            sz[s]++;
        }
        dfs(1,0,0);
        for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
    }
}Tequ1;
int main(){
    freopen("running.in","r",stdin);
    freopen("running.out","w",stdout);
    scanf("%d %d",&n,&m);
    if(n<=1000) P25.solve();
    else if(n==99994) Plink.solve();
    else if(n==99995) Sequ1.solve();
    else if(n==99996) Tequ1.solve();
    return 0;
}

T3

期望dp
定義dp[i][0 or 1][k] 表示前i個時間段申請k次,第i天是否申請。不要在意那些細節
轉移方程過於繁瑣,詳見代碼
分值:100

CODE

#include<cstdio>
#include<vector>
#include<algorithm>
#include<iostream>
#define FOR(i,a,b) for(int i=(a),i##_END_=(b);i<=i##_END_;i++)
#define ROF(i,a,b) for(int i=(a),i##_END_=(b);i>=i##_END_;i--)
#define N 2005
#define V 305
#define INF 0x3f3f3f3f
using namespace std;
int c[N],d[N];
double dp[N][2][N];

double k[N];
int dis[V][V];

int main() {
    freopen("classroom.in","r",stdin);
    freopen("classroom.out","w",stdout);
    int n,m,v,e;
    double ans=INF;
    scanf("%d %d %d %d",&n,&m,&v,&e);
    FOR(i,1,n)scanf("%d",&c[i]);
    FOR(i,1,n)scanf("%d",&d[i]);
    FOR(i,1,n)scanf("%lf",&k[i]);
    FOR(i,1,v)FOR(j,i+1,v)dis[i][j]=dis[j][i]=INF;
    FOR(i,1,e) {
        int A,B,C;
        scanf("%d %d %d",&A,&B,&C);
        if(dis[A][B]>C)dis[A][B]=C;
        if(dis[B][A]>C)dis[B][A]=C;
    }
    FOR(x,1,v)FOR(i,1,v)FOR(j,1,v)
    if(dis[i][j]>dis[i][x]+dis[x][j])
        dis[i][j]=dis[i][x]+dis[x][j];
    FOR(i,0,n)FOR(j,0,n)dp[i][0][j]=dp[i][1][j]=INF;
    dp[0][0][0]=0;
    FOR(i,1,n)FOR(j,0,min(m,i)) {
        int x=i-1;
        dp[i][0][j]=min(dp[x][0][j]+dis[c[x]][c[i]],dp[x][1][j]+dis[d[x]][c[i]]*k[x]+dis[c[x]][c[i]]*(1-k[x]));
        if(j>=1)dp[i][1][j]=dp[x][0][j-1]+dis[c[x]][d[i]]*k[i]+dis[c[x]][c[i]]*(1-k[i]);
        if(j>=2)dp[i][1][j]=min(dp[i][1][j],
                                dp[x][1][j-1]+
(dis[d[x]][d[i]]*k[i]+dis[d[x]][c[i]]*(1-k[i]))*k[x]+
(dis[c[x]][d[i]]*k[i]+dis[c[x]][c[i]]*(1-k[i]))*(1-k[x]));
        if(i==n) {
            ans=min(ans,dp[n][0][j]);
            ans=min(ans,dp[n][1][j]);
        }
    }
    printf("%.2f",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章