codeforces 1300

Codeforces Round #618 (Div. 2)

A做的还是不快 卡了一下B 果断开了C 然后回头发现B怎么过的人这么多 就想到了 最后抄板子过了D 一度以为能直接到蓝 熬了两个小时想看颜色变化 顶不死睡了起床发现只涨了100 而且也没有以前有过的涨很多分的congratulation

A

题意:一次操作可以使数组的某个元素自增一次  问最少的操作次数使得数组元素的和与积不为0

        if(sum==0)
        {
            if(zero)
                ans=zero;
            else
                ans=1;
        }
        else
        {
            ans=zero;
            sum+=zero;
            if(sum==0)
                ans++;
        }

 

B

题意:    给定一个长度为2*n的数组 将其划分为两个奇数长度的数组 两部分的中位数之差绝对值最小值

输出排序后中间的两个数之差即可 因为构造出的所有划分方法一定都会大于这个值

 

C

题意: 定义了一种函数f(x,y) 得到x的bit集合减去y的bit集合 求一个数组按照怎样的顺序调用这个函数使得最后的bit集合代表的值最大

找到最高的不重复的bit代表的数字放在第一个即可

 

D

题意: 将一个凸包s的每个点放在原点上 其他点放进t中 最后t围一个凸包 问s和t是否相似

把这三句话都实现了 写成了板子计算几何题 竟然也过了 其实只需要检验s是否为中心对称图形

 

E

题意:正整数数组 一次操作是将区间内的数替代为这个区间内的平均数 进行若干次 求能得到的字典序最小的数组

将n个数分成n块 对每一块判断能否与前面的一块合并 能则合并 不能则成为新块 注意这里成为新块后仍然有机会与后面的块合并后再与前面合并 这里wa了挺久

另外官方题解上的凸包做法是将每个数看做(i,s[i])的点 s是前缀和 再把原点放进去 点与点之间的边的斜率代表这个区间的平均数 那么这个点集的下凸包就是字典序最小的方案即答案 白书和笔记不在家 已经不知道graham andrew这些东西都是什么了 回学校补

void slove1()
{
    int p=0;
    for(int i=0;i<n;i++)
    {
        p++;
        st[p]=a[i];
        len[p]=1;
        while(p>1&&st[p]<st[p-1])
        {
            st[p-1]=(st[p-1]*len[p-1]+st[p]*len[p])/(len[p]+len[p-1]);
            len[p-1]=len[p-1]+len[p];
            p--;
        }
    }
    for(int i=1;i<=p;i++)
    {
        for(int j=0;j<len[i];j++)
            printf("%.10f\n",st[i]);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值