• NOIP模拟赛20161007


    %hzwer

    http://hzwer.com/7602.html

     

    题目名称

    “与”

    小象涂色

    行动!行动!

    输入文件

    and.in

    elephant.in

    move.in

    输出文件

    and.out

    elephant.in

    move.in

    时间限制

    1s

    1s

    1s

    空间限制

    64MB

    128MB

    128MB

     

    “与”

    (and.pas/.c/.cpp)

    时间限制:1s;空间限制64MB

    题目描述:

    给你一个长度为n的序列A,请你求出一对Ai,Aj(1<=i<j<=n)使Ai“与”Aj最大。

    Ps:“与”表示位运算and,在c++中表示为&。

    输入描述:

    第一行为n。接下来n行,一行一个数字表示Ai。

    输出描述:

    输出最大的Ai“与”Aj的结果。

    样例输入:

    3

    8

    10

    2

    样例输出:

    8

    样例解释:

    8 and 10 = 8

    8 and 2 = 0

    10 and 2 = 2

    数据范围:

    20%的数据保证n<=5000

    100%的数据保证 n<=3*10^5,0<=Ai<=10^9


    贪心

    全打成二进制,从最高位开始考虑,维护一个列表

    如果当前位是1的大于等于两个,那么此位可以是1,并且下一位只从这一位是1的里面找,所以列表只留下是1的

    如果当前位是1的少于两个,则此位不可能是1,列表不变

    PS:然而数据太弱,两个最大值&就是。其实只要最大值的二进制长度唯一,这个方法就WA

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    const int N=3e5+5;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int n,a[N],ans[30];
    int f[N][35];
    int lst[N],cnt=0;
    int tmp[N],t=0;
    void debug(int x){
        printf("debug %d
    ",x);
        for(int i=1;i<=cnt;i++) printf("%d ",lst[i]);
        printf("
    ");
    }
    void sol(int d){
        if(d<0) return;
        t=0;
        for(int i=1;i<=cnt;i++){
            int x=lst[i];
            if(f[x][d]) tmp[++t]=x;
        }
        if(t>=2){
            ans[d]=1;
            cnt=0;
            for(int i=1;i<=t;i++) lst[++cnt]=tmp[i];
        }
        //debug(d);
        sol(d-1);
    }
    int main(){
        freopen("and.in","r",stdin);
        freopen("and.out","w",stdout);
        
        n=read();
        for(int i=1;i<=n;i++){
            a[i]=read();
            for(int j=0;j<=29;j++)
                if(a[i]&(1<<j)) f[i][j]=1;//,printf("%d %d
    ",i,j); 
        }
        for(int d=29;d>=0;d--){
            cnt=0;
            for(int i=1;i<=n;i++) if(f[i][d]) lst[++cnt]=i;
            if(cnt<2) continue;
            ans[d]=1;    
            //debug(d);
            sol(d-1);break;
        }
        int x=0;
        for(int i=29;i>=0;i--) if(ans[i]) x+=(1<<i);
        printf("%d",x);
    }


    小象涂色

    (elephant.pas/.c/.cpp)

    时间限制:1s,空间限制128MB

    题目描述:

    小象喜欢为箱子涂色。小象现在有c种颜色,编号为0~c-1;还有n个箱子,编号为1~n,最开始每个箱子的颜色为1。小象涂色时喜欢遵循灵感:它将箱子按编号排成一排,每次涂色时,它随机选择[L,R]这个区间里的一些箱子(不选看做选0个),为之涂上随机一种颜色。若一个颜色为a的箱子被涂上b色,那么这个箱子的颜色会变成(a*b)mod c。请问在k次涂色后,所有箱子颜色的编号和期望为多少?

    输入描述:

    第一行为T,表示有T组测试数据。

    对于每组数据,第一行为三个整数n,c,k。

    接下来k行,每行两个整数Li,Ri,表示第i个操作的L和R。

    输出描述:

    对于每组测试数据,输出所有箱子颜色编号和的期望值,结果保留9位小数。

    样例输入:

    3

    3 2 2

    2 2

    1 3

    1 3 1

    1 1

    5 2 2

    3 4

    2 4

    样例输出:

    2.062500000

    1.000000000

    3.875000000

    数据范围:

    40%的数据1 <= T <= 5,1 <= n, k <= 15,2 <= c <= 20

    100%的数据满足1 <= T <= 10,1 <= n, k <= 50,2 <= c <= 100,1 <= Li <= Ri <= n


    不明白什么是期望

    在概率论和统计学中,数学期望(mean)(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和。是最基本的数学特征之一。它反映随机变量平均取值的大小。

    看了题解

    每个箱子只有染色次数不同,可以统一考虑

    因为区间里随机选,所以1/2;因为c种颜色,所以1/c

    f[i][j]表示染色i次颜色为j的概率

      f[i+1][j]+=f[i][j]/2;

      f[i+1][j*x%c]+=f[i][j]/2/c; x枚举颜色

    【DP用更新的写法比较好】

    用sum[i]统计染色i次的颜色和期望值

    然后求和每个点的贡献sum[这个点染色次数]

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    typedef long long ll;
    const int N=55,C=105;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int T,n,c,k,t[N],l,r;
    double f[N][C],sum[N];
    void dp(){
        memset(f,0,sizeof(f));
        memset(sum,0,sizeof(sum));
        f[0][1]=1;
        for(int i=0;i<=k;i++)
            for(int j=0;j<c;j++){
                f[i+1][j]+=f[i][j]/2;
                for(int x=0;x<c;x++)
                    f[i+1][j*x%c]+=f[i][j]/2/c;
            }
        for(int i=0;i<=k;i++)//!
            for(int j=0;j<c;j++) sum[i]+=f[i][j]*j;
    }
    int main(){
        //freopen("elephant.in","r",stdin);
        //freopen("elephant.out","w",stdout);
        T=read();
        while(T--){
            memset(t,0,sizeof(t));
            n=read();c=read();k=read();
            for(int i=1;i<=k;i++){
                l=read();r=read();
                for(int j=l;j<=r;j++) t[j]++;
            }
            dp();
            double ans=0;
            for(int i=1;i<=n;i++) ans+=sum[t[i]];
            printf("%.9lf
    ",ans);
        }
    }


    行动!行动!

    (move.pas/.c/.cpp)

    时间限制:1s;空间限制:128MB

    题目描述:

    大CX国的大兵Jack接到一项任务:敌方占领了n座城市(编号0~n-1),有些城市之间有双向道路相连。Jack需要空降在一个城市S,并徒步沿那些道路移动到T城市。虽然Jack每从一个城市到另一个城市都会受伤流血,但大CX国毕竟有着“过硬”的军事实力,它不仅已经算出Jack在每条道路上会损失的血量,还给Jack提供了k个“简易急救包”,一个包可以让Jack在一条路上的流血量为0。Jack想知道自己最少会流多少血,不过他毕竟是无脑的大兵,需要你的帮助。

    输入描述:

    第一行有三个整数n,m,k,分别表示城市数,道路数和急救包个数。

    第二行有两个整数,S,T。分别表示Jack空降到的城市编号和最终要到的城市。

    接下来有m行,每行三个整数a,b,c,表示城市a与城市b之间有一条双向道路。

    输出描述:

    Jack最少要流的血量。

    样例输入:

    5 6 1

    0 3

    3 4 5

    0 1 5

    0 2 100

    1 2 5

    2 4 5

    2 4 3

    样例输出:

    8

    数据范围:

    对于30%的数据,2<=n<=50,1<=m<=300,k=0;

    对于50%的数据,2<=n<=600,1<=m<=6000,0<=k<=1;

    对于100%的数据,2<=n<=10000,1<=m<=50000,0<=k<=10.


    分层图最短路

    不就是那道飞行路线

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #include <queue>
    using namespace std;
    typedef long long ll;
    const int N=1e4+5,M=5e4+5,K=12,INF=1e9+5;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int n,m,k,s,t,a,b,c,ans=INF;
    struct edge{
        int v,w,ne;
    }e[M<<1];
    int cnt=0,h[N];
    inline void ins(int u,int v,int w){
        cnt++;
        e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
        cnt++;
        e[cnt].v=u;e[cnt].w=w;e[cnt].ne=h[v];h[v]=cnt;
    }
    struct hn{
        int u,d,f;
        bool operator <(const hn &rhs)const{return d>rhs.d;}
        hn(int a=0,int b=0,int c=0):u(a),d(b),f(c){}
    };
    int d[N][K],done[N][K];
    void dijkstra(int s){
        priority_queue<hn> q;
        for(int i=0;i<n;i++) for(int j=0;j<=k;j++) d[i][j]=INF;
        d[s][0]=0;
        q.push(hn(s,0,0));
        while(!q.empty()){
            hn x=q.top();q.pop();
            int u=x.u,f=x.f;
            if(done[u][f]) continue;
            done[u][f]=1;//printf("dij %d %d %d
    ",u,f,d[u][f]);
            for(int i=h[u];i;i=e[i].ne){
                int v=e[i].v,w=e[i].w;
                if(d[v][f]>d[u][f]+w){
                    d[v][f]=d[u][f]+w;//printf("v %d %d %d
    ",v,f,d[v][f]);
                    q.push(hn(v,d[v][f],f));
                }
                
                if(f<k){
                    if(d[v][f+1]>d[u][f]){
                        d[v][f+1]=d[u][f];//printf("v %d %d %d
    ",v,f+1,d[v][f+1]);
                        q.push(hn(v,d[v][f+1],f+1));
                    }
                }
            }
        }
    }
    
    int main(){
        freopen("move.in","r",stdin);
        freopen("move.out","w",stdout);
        n=read();m=read();k=read();s=read();t=read();
        for(int i=1;i<=m;i++){
            a=read();b=read();c=read();
            ins(a,b,c);
        }
        dijkstra(s);
        for(int i=0;i<=k;i++) ans=min(ans,d[t][i]);//,printf("%d %d
    ",i,d[t][i]);
        printf("%d",ans);
    }
  • 相关阅读:
    RDIFramework.NET框架基于Quartz.Net实现任务调度详解及效果展示
    Quartz.Net实现作业定时调度详解
    微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示
    微信公众号开发C#系列-12、微信前端开发利器:WeUI
    微信公众号开发C#系列-11、生成带参数二维码应用场景
    微信公众号开发C#系列-10、长链接转短链接
    微信公众号开发C#系列-9、多公众号集中管理
    微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理
    微信公众号开发C#系列-7、消息管理-接收事件推送
    微信公众号开发C#系列-5、用户和用户组管理-支持同步
  • 原文地址:https://www.cnblogs.com/candy99/p/5936431.html
Copyright © 2020-2023  润新知