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\n", i, cnt);
    }
}

int main() {
    test();
    cin>>n;
    if(n<20) printf("%d\n", ans[n]);
    else printf("%lld\n", ans[11]+(n-11)*49);
}
View Code

猜你喜欢

转载自www.cnblogs.com/MXang/p/9253014.html
今日推荐