• 11.1 morning


    完美的序列(sequence)
    Time Limit:1000ms Memory Limit:64MB
    题目描述
    LYK 认为一个完美的序列要满足这样的条件:对于任意两个位置上的数都不相同。然而
    并不是所有的序列都满足这样的条件。
    于是 LYK 想将序列上的每一个元素都增加一些数字(当然也可以选择不增加),使得整个
    序列变成美妙的序列。
    具体地, LYK 可以花费 1 点代价将第 i 个位置上的数增加 1,现在 LYK 想花费最小的代价
    使得将这个序列变成完美的序列。
    输入格式(sequence.in)
    第一行一个数 n,表示数字个数。
    接下来一行 n 个数 ai 表示 LYK 得到的序列。
    输出格式(sequence.out)
    一个数表示变成完美的序列的最小代价。
    输入样例
    4
    1 1 3 2
    输出样例
    3
    数据范围
    对于 30%的数据 n<=5。
    对于 60%的数据 n<=1000。
    对于 80%的数据 n<=30000, ai<=3000。
    对于 100%的数据 n<=100000, 1<=ai<=100000。

    贪心开始写wa了....

    /*考试的时候贪心贪错了 其实模拟一下就好 排一遍序 如果a[i]<=a[i-1]就把a[i]变成a[i-1]+1*/
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define maxn 100010
    #define ll long long
    using namespace std;
    ll n,a[maxn],ans;
    ll init(){
        ll x=0,f=1;char s=getchar();
        while(s<'0'||s>'9'){if(s=='0')f=-1;s=getchar();}
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        return x*f;
    }
    int main()
    {
        freopen("sequence.in","r",stdin);
        freopen("sequence.out","w",stdout);
        n=init();
        for(int    i=1;i<=n;i++)
            a[i]=init();
        sort(a+1,a+1+n);
        for(int i=2;i<=n;i++)
            if(a[i]<=a[i-1]){
                ans+=a[i-1]-a[i]+1;
                a[i]=a[i-1]+1;
            }
        cout<<ans<<endl;
        return 0;
    }
    View Code


    LYK 与实验室(lab)
    Time Limit:5000ms Memory Limit:64MB
    题目描述
    LYK 在一幢大楼里,这幢大楼共有 n 层, LYK 初始时在第 a 层上。
    这幢大楼有一个秘密实验室,在第 b 层,这个实验室非常特别,对 LYK 具有约束作用,
    即若 LYK 当前处于 x 层,当它下一步想到达 y 层时,必须满足|x-y|<|x-b|,而且由于实验室
    是不对外开放的,电梯无法停留在第 b 层。
    LYK 想做一次旅行,即它想按 k 次电梯,它想知道不同的旅行方案个数有多少个。
    两个旅行方案不同当前仅当存在某一次按下电梯后停留的楼层不同。
    输入格式(lab.in)
    一行 4 个数, n,a,b,k。
    输出格式(lab.out)
    一个数表示答案,由于答案较大,将答案对 1000000007 取模后输出。
    输入样例 1
    5 2 4 1
    输出样例 1
    2
    输入样例 2
    5 2 4 2
    输出样例 2
    2
    输入样例 3
    5 3 4 1
    输出样例 3
    0
    数据范围
    对于 20%的数据 n,k<=5。
    对于 40%的数据 n,k<=10。
    对于 60%的数据 n,k<=500。
    对于 90%的数据 n,k<=2000。
    对于 100%的数据 n,k<=5000。

     dp+优化

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 5010
    #define mod 1000000007
    using namespace std;
    int n,a,b,k;
    long long f[2][maxn],s1[maxn],s2[maxn],ans;
    int main()
    {
        freopen("lab.in","r",stdin);
        freopen("lab.out","w",stdout);
        cin>>n>>a>>b>>k;
        f[0][a]=1;
        for(int i=1;i<=k;i++){
            s1[0]=0;s2[n+1]=0;
            for(int j=1;j<=n;j++)
                if(j==b)s1[j]=s1[j-1];
                else s1[j]=(s1[j-1]+f[i-1&1][j])%mod;
            for(int j=n;j>=1;j--)
                if(j==b)s2[j]=s2[j+1];
                else s2[j]=(s2[j+1]+f[i-1&1][j])%mod;
            for(int j=1;j<=n;j++)if(j!=b){
                if(j<b){
                    f[i&1][j]=(s1[(j+b+1)/2-1]-f[i-1&1][j]+mod)%mod;
                }
                if(j>b){
                    f[i&1][j]=(s2[(j+b)/2+1]-f[i-1&1][j]+mod)%mod;
                }
            }
            for(int j=1;j<=n;j++)
                f[i-1&1][j]=0;
        }
        for(int i=1;i<=n;i++)
            if(i!=b){
                ans+=f[k&1][i];
                if(ans>mod)ans%=mod;
            }
        cout<<ans<<endl;
        return 0;
    }
    View Code

    旅行(travel)
    Time Limit:1000ms Memory Limit:64MB
    题目描述
    LYK 想去一个国家旅行。这个国家共有 n 个城市,有些城市之间存在道路,我们假定这
    些道路长度都是 1 的,更准确的说,共有 m 条道路。
    我们定义城市 A 与城市 B 的最短路为 A 到 B 的所有路径中,经过的道路最少的那条道
    路。最短路的长度为这条道路的所有道路长度之和,由于所有道路长度都为 1,因此假如 A
    到 B 之间最短路的道路条数为 k,则 A 到 B 的最短路长度为 k。
    我们定义整个国家的最短路为任意两个城市( A,B 与 B,A 算作不同的点对)之间的最短
    路长度的和。
    然而这个国家正处于危乱之中,极有可能一条道路会被恐怖分子炸毁。
    LYK 想知道,万一某条道路被炸毁了,整个国家的最短路为多少。若炸毁这条道路后整
    个国家不连通了,那么就输出“ INF” (不加引号)。
    输入格式(travel.in)
    第一行两个数 n,m。
    接下来 m 行,每行两个数 u,v,表示存在一条道路连接 u,v(数据保证不存在自环)。
    输出格式(travel.out)
    输出 m 行,第 i 行的值表示当第 i 条道路被炸毁时,整个国家的最短路是多少,若图不
    连通,则输出“ INF”。
    输入样例
    2 2
    1 2
    1 2
    输出样例
    2 2
    数据范围
    对于 20%的数据 n<=10,n<m<=100。
    对于 40%的数据 1<=n<m<=100。
    对于 70%的数据 1<=n<=100,n<m<=3000。
    对于再另外 10%的数据对于所有节点( i 1<=i<n),存在一条边连接 i与 i+1,且 n=m,n<=100。
    对于再再另外 10%的数据对于所有节点 i( 1<=i<n),存在一条边连接 i 与 i+1,且 n=m,
    n<=1000。
    对于再再再另外 10%的数据对于所有节点( i 1<=i<n),存在一条边连接 i 与 i+1,且 n=m,
    n<=100000。

    70最短路树  另外的容斥原理弃疗了2333

    #include<cstdio>
    #define inf 1e14
    #define ll long long
    #define maxn 3010
    #ifdef unix
    #define LL "%lld
    "
    #else
    #define LL "%I64d
    "
    #endif
    using namespace std;
    int n,m,num,head[maxn],c[maxn][maxn];
    int q[maxn*10],hea,tai,f[maxn];
    ll sum[maxn],dis[maxn];
    struct node{
        int v,pre,bz;
    }e[maxn*2];
    struct edge{
        int u,v;
    }p[maxn];
    void Add(int from,int to,int x){
        num++;e[num].v=to;
        e[num].bz=x;
        e[num].pre=head[from];
        head[from]=num;
    }
    int init(){
        int x=0,f=1;char s=getchar();
        while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        return x*f;
    }
    void Bfs(int s){
        for(int i=1;i<=n;i++)dis[i]=inf;
        for(int i=1;i<=n;i++)f[i]=0;
        hea=0;tai=0;
        q[++tai]=s;dis[s]=0;f[s]=1;
        while(hea<=tai){
            int k=q[++hea];
            for(int i=head[k];i;i=e[i].pre){
                int v=e[i].v;
                if(f[v])continue;
                q[++tai]=v;dis[v]=dis[k]+1;
                c[s][v]=k;f[v]=1;
            }
        }
        for(int i=1;i<=n;i++)
            sum[s]+=dis[i];
    }
    ll bfs(int s,int x){
        for(int i=1;i<=n;i++)dis[i]=inf;
        for(int i=1;i<=n;i++)f[i]=0;
        hea=0;tai=0;
        q[++tai]=s;dis[s]=0;f[s]=1;
        while(hea<=tai){
            int k=q[++hea];
            for(int i=head[k];i;i=e[i].pre){
                int v=e[i].v;
                if(f[v]||e[i].bz==x)continue;
                q[++tai]=v;dis[v]=dis[k]+1;f[v]=1;
            }
        }
        ll ret=0;
        for(int i=1;i<=n;i++)
            ret+=dis[i];
        return ret;
    }
    int main()
    {
        freopen("travel.in","r",stdin);
        freopen("travel.out","w",stdout);
        n=init();m=init();
        int u,v;long long mx;
        for(int i=1;i<=m;i++){
            u=init();v=init();
            Add(u,v,i);Add(v,u,i);
            p[i].u=u;p[i].v=v;
        }
        for(int i=1;i<=n;i++)Bfs(i);
        for(int k=1;k<=m;k++){
            u=p[k].u;v=p[k].v;mx=0;
            for(int i=1;i<=n;i++)
                if(c[i][u]!=v&&c[i][v]!=u)
                    mx+=(ll)sum[i];
                else mx+=(ll)bfs(i,k);
            if(mx>=inf)printf("INF
    ");
            else printf(LL,mx);
        }
        fclose(stdin);fclose(stdout);
        return 0;
    }
    View Code
  • 相关阅读:
    zzulioj1908: 小火山的围棋梦想
    zzulioj1913: 小火山的计算能力
    zullioj1905: 小火山的跳子游戏
    HDU 1025:Constructing Roads In JGShining's Kingdom
    HDU 1257:最少拦截系统
    HDU1051:Wooden Sticks
    HDU1950:Bridging signals
    HDU1087:Super Jumping! Jumping! Jumping!
    HDU5256: 序列变换
    3.SpringBoot配置文件以及自动配置原理
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/6037510.html
Copyright © 2020-2023  润新知