• 2018牛客暑期ACM多校训练营第二场(有坑未填)


    第二场终于等来学弟 开始(被队友带飞)的开心(被虐)多校之旅

    A   run

    A题是一个递推(dp?)+前缀和 因为看数据量比较大 就直接上前缀和了 

    一个比较简单的递推 没有太多难点 签到题 需要注意的一个点是在最后求前缀和相减取模的过程中先加上一个MOD 防止相减变成负数

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=1e5+10;
    const int MOD=1e9+7;
    int dp[N][2];
    int l[N],r[N],sum[N];
    int main(){
        int q,k;
        scanf("%d%d",&q,&k);
        memset(dp,0,sizeof(dp));
        memset(sum,0,sizeof(sum));
        int maxn=0;
        for(int i=1;i<=q;i++){
            scanf("%d%d",&l[i],&r[i]);
            maxn=max(maxn,r[i]);
        }
        for(int i=0;i<=k-1;i++){
            dp[i][0]=1;
            dp[i][1]=0;
        }
        for(int i=k;i<=maxn;i++){
            dp[i][0]=(dp[i-1][0]+dp[i-1][1])%MOD;
            dp[i][1]=dp[i-k][0];
        }
        for(int i=1;i<=maxn;i++){
            sum[i]+=(sum[i-1]+dp[i][0]+dp[i][1])%MOD;
        }
        for(int i=1;i<=q;i++){
            printf("%d
    ",(sum[r[i]]-sum[l[i]-1]+MOD)%MOD);
        }
        return 0;
    } 
    View Code

    D   money

    比赛中是队友写的 没有研究很多 赛后自己补题的时候用了模拟的思想 还有说可以用dp的 这里也没有想了

    模拟的话 用tmp表示买进的价格 从a[0]开始与后一个比较 如果a[i]小于tmp 则表明可以用更低的价格去购买 同时用flag=0标记表明这一个是可以买的商品 

    如果a[i]大于tmp 则表明这是可以卖出的价格 假设在这一个点卖出 用flag=1标记在这里可以卖出 tmp更新为a[i] 用于检查之后是否有连续价格更高的可以卖的商品 如果之前已经有标记flag为1 表示前面的cnt已经有过更新 这里就不用再更新了 

    具体代码如下

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int maxn=1e5+10;
    int a[maxn];
    int main(){
        int t,n;
        scanf("%d",&t);
        while(t--){
            scanf("%d",&n);
            for(int i=0;i<n;i++){
                scanf("%d",&a[i]);
            } 
            ll sum=0,cnt=0,tmp=a[0];
            int flag=0;
            for(int i=1;i<n;i++){
                if(tmp>a[i]){
                    tmp=a[i];
                    flag=0;
                }
                if(tmp<a[i]){
                    sum+=(a[i]-tmp);
                    cnt+=2;
                    tmp=a[i];
                    if(flag==1) cnt-=2;
                    flag=1;
                 }
            }
            printf("%lld %lld
    ",sum,cnt);
        }
        return 0;
    } 
    View Code

    剩余题目先留坑 补完题再来

  • 相关阅读:
    自己动手实现java数据结构(五)哈希表
    自己动手实现java数据结构(四)双端队列
    自己动手实现java数据结构(三) 栈
    自己动手实现java数据结构(二) 链表
    自己动手实现java数据结构(一) 向量
    redis学习(七)redis主从复制
    redis学习(六)redis管道
    msf之meterpreter权限绑定以及端口转发
    MSF查找提权exp
    Cobait Strike的socks与ew代理使用
  • 原文地址:https://www.cnblogs.com/whdsunny/p/9350390.html
Copyright © 2020-2023  润新知