zoukankan      html  css  js  c++  java
  • CF Round #355 Div.2

    http://codeforces.com/contest/677

    B. Vanya and Food Processor

    题意:有一个食物加工器,每次能加工不超过h高度的土豆,且每秒加工至多k高度的土豆(每次加工完高度变为0)。有n个高度为ai的土豆,每秒钟,只要加工器里面剩余的土豆高度不超过k,且外面还有剩余的土豆未被加工,就会把外面剩余的土豆放进加工器里。问需要多少秒才能加工完全部土豆?

    思路:用变量add来记录某时刻加工器内土豆的高度,遍历n个土豆们,

    (1)每次比较add+ai是否超过h,若超过,则说明有超出h的部分需要另外加工,故ans++,并且add=0置零;

    (2)再add+=ai,ans+=(add/k);因为每次只能加工k高度的土豆,所以需要add/k秒,然后处理一下加工后剩余的add值 add%=k,然后进入下一次循环,最终得到ans即为所需的总时间。

     

    代码: //注意:因为a,h和k可以很大,所以ans要是long long型的。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    
    int a[100005];
    
    int main()
    {
        int n,h,k;
        scanf("%d%d%d",&n,&h,&k);
        ll ans=0,add=0;
        for(int i=0;i<n;i++)
        {
            int a;
            scanf("%d",&a);
            if(add+a>h)
            {
                ans++;
                add=0;
            }
            add+=a;
            ans+=(add/k);
            add%=k;
        }
        if(add) ans++;
        printf("%I64d
    ",ans);
        return 0;
    }


    C. Vanya and Label

    题意:给一字符串s,将s按照以下规则进行转换,每个字符对应一个数值,规则如下:

                                                   image

              问有多少种长度与s相同的字符串,与转换后的s按位与(&)的结果仍然为s?(结果需要mod 10e9+7)

    思路:好的然后tutorial是这么说的:

       image

           每个字符转换后都可以表示为一个二进制数,并且不超过2^6,而对于每个字符对应的二进制数,当它的某个位上为0时,有种情况可以保证&后不变(仍为0):即0&1,1&0,0&0,当某个位上为1时,则只有一种情况能保证&后不变(仍为1):即1&1,所以串中的每个字符有3^x种情况符合(实际上是3^x * 1^(len(s)-x)),x表示某个字符的二进制数有x个位为0。

     

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    #define MOD 1000000007
    
    char s[100005];
    
    int main()
    {
        scanf("%s",s);
        ll ans=1;
        int len=strlen(s);
        for(int i=0;i<len;i++)
        {
            int x;
            if(s[i]>='0'&&s[i]<='9') x=s[i]-'0';
            if(s[i]>='A'&&s[i]<='Z') x=s[i]-'A'+10;
            if(s[i]>='a'&&s[i]<='z') x=s[i]-'a'+36;
            if(s[i]=='-') x=62;
            if(s[i]=='_') x=63;
    
            for(int j=0;j<6;j++)
                if((x&(1<<j))==0)
                    ans=(ans*3)%MOD;
        }
        printf("%I64d
    ",ans);
        return 0;
    }
  • 相关阅读:
    导弹拦截
    背包求方案的字典序
    分组背包
    关于字符串的简单dp
    dp进阶——饥饿的奶牛
    压缩维度oj P1173+P1174+P1164
    搜索——迭代加深
    委外倒冲领料
    QLIKVIEW-SALESORDERDELIVERYNOTICEOUTSTOCKINVOICE
    设置采购订单供应商权限设置
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5553826.html
Copyright © 2011-2022 走看看