• codeforces R 493 div2


    我蓝了!蓝了!!!蒟蒻的蓝色。日常点开friend发现竟然没几个人打??然后去div1看了一下果然学长全都去打div1了呜呜呜。

    看到了久违的黄大仙,以为他今晚要上grandmaster,结果打完发现他取消注册了。。。

    题外话,div2半小时过完abc,d题推了一个多小时无果,div一千五百人同时在推D题,海上生明月,天涯共此时!(还好我手速快。。。)

    上午考完英语三十个单选一百多个选项单词不认识。。。后天高数军理大后天大物,这几天暂时不打了。(好像也只有一场div3

    A:我感觉我是瞎做的

    all是整个数列的和,然后我们算前缀和sum,只要 sum!=all-sum,那么这个位置之前的都选出来就行了。注意特判个别情况

    B:贪心+优先队列(或者存进数组然后排序),所有能分割的地方 都把 花费 存进来,然后前缀和<B就行。

    只贴main方法,快速io太长容易引起不适,请忽略我的冒泡排序。。。

     public static void main(String[] args) {
            int n = nextInt();
            int B = nextInt();
            int ans[] = new int[n];
            int index = 0;
            int a[] = new int[n];
            for(int i=0;i<n;i++){
                a[i] = nextInt();
            }
            int odd = 0;
            int even = 0;
            for(int i=0;i<n;i++){
                if (a[i]%2==0)
                    even++;
                else
                    odd++;
                if (even==odd){
                    if (i==n-1){
                        break;
                    }else {
                        ans[index++]=Math.abs(a[i+1]-a[i]);
                        odd=0;
                        even=0;
                    }
                }
            }
            for(int i=0;i<index;i++){
                for(int j=i+1;j<index;j++){
                    if (ans[j]<ans[i]){
                        int temp = ans[i];
                        ans[i]=ans[j];
                        ans[j]=temp;
                    }
                }
            }
            if (index==0){
                out.print(0);
                out.flush();
                return;
            }
    
            int sum[] = new int[index];
            sum[0] = ans[0];
            for(int i=1;i<index;i++){
                sum[i]=sum[i-1]+ans[i];
            }
            for(int i=0;i<index;i++){
                if (sum[i]>B){
                    out.print(i);
                    out.flush();
                    return;
                }
            }
            out.print(index);
            out.flush();
            return;
        }
    View Code  

    C:用了十分钟过掉的,,,还是太菜了,看了好久才找到规律

    很显然我们要找到  连续 0 子段 的 个数(我太菜了说不清楚),假如有n个,那么我们n次y操作一定可以,或者n-1次x操作加一次y操作。

    public static void main(String[] args) {
            int n = nextInt();
            long x = nextLong();
            long y = nextLong();
            String s = next();
            char ch[] = s.toCharArray();
            int num = 0;
            for(int i=0;i<n;){
                if (ch[i]=='0'){
                    num++;
                    for(int j=i;j<n;j++){
                        if (ch[j]=='1'){
                            i=j;
                            break;
                        }
                        else if (j==n-1){
                            i=n;
                            break;
                        }
                    }
                }else
                    i++;
            }
            if (num==0){
                out.print(0);
            }
            else if (y<=x){
                out.print(y*num);
            }else {
                out.print((num-1)*x+y);
            }
            out.flush();
        }
    View Code

    D:毒瘤啊 刚才看了看学长的代码发现自己的思路竟然是错的,早知道半个小时过掉abc就去睡觉,也不至于今天英语考试一副要死的样子。。。

    问题是我真的感觉自己要挂科了,贴一份学长的代码(大家可以努力看看。。。。。)

    要是看懂了的话顺便给我讲讲,,考试周了我这种蒟蒻一般不敢打扰学长。。。

    #include <iostream>
    using namespace std;
    typedef long long LL;
    LL n;
    
    int dp[102][10002], ans[100];
    void test(){
        dp[0][0]=1;
        for(int i=1;i<=30;i++){
            for(int j=1;j<=10000;j++){
                if(j>=1&&dp[i-1][j-1]) dp[i][j]=1;
                if(j>=5&&dp[i-1][j-5]) dp[i][j]=1;
                if(j>=10&&dp[i-1][j-10]) dp[i][j]=1;
                if(j>=50&&dp[i-1][j-50]) dp[i][j]=1;
            }
            int cnt=0;
            for(int j=1;j<=10000;j++) cnt+=dp[i][j];
            ans[i]=cnt;
            //printf("%d %d
    ", i, cnt);
        }
    }
    
    int main() {
        test();
        cin>>n;
        if(n<20) printf("%d
    ", ans[n]);
        else printf("%lld
    ", ans[11]+(n-11)*49);
    }
    View Code

    下面这个是黄大仙的D题,,,看了下提交记录用了不到十分钟,,不过几乎没有可读性。。。可能这就是神仙吧.jpg

    #include<iostream>
    #include<cstdio>
    #include<bitset>
    const int N=1005;
    std::bitset<N> dp[14],tmp;
    int main() {
        dp[0][0]=1;
        for(int i=1;i<=13;i++) {
            tmp=dp[i-1];
            dp[i]|=tmp<<1;
            dp[i]|=tmp<<5;
            dp[i]|=tmp<<10;
            dp[i]|=tmp<<50;
        }
        int n,ans=dp[13].count();
        scanf("%d",&n);
        if(n<=13) printf("%d
    ",int(dp[n].count()));
        else printf("%lld
    ",1LL*(n-13)*49+ans);
        return 0;
    }
    View Code
  • 相关阅读:
    6.9 系统标识
    6.5 附加组ID
    6.4 组文件
    Silverlight1.0开发向导
    正版Microsoft Expression Studio开发套件入手
    百度百科中对silverlight的介绍
    UMU支持微软从今天开始使用 XPS 格式,逐渐放弃 PDF 格式
    今天参加了微软论坛新年Party!
    Windows Media Player在页面中调用的常用属性和方法
    .Net Frameworks 3.5 和 .Net Frameworks 3.5 SP1完整版下载
  • 原文地址:https://www.cnblogs.com/MXang/p/9253014.html
Copyright © 2020-2023  润新知