首页 > 其他分享 >CSP模拟15

CSP模拟15

时间:2023-08-07 20:35:27浏览次数:40  
标签:cnt ch 15 int dp tot 进位 CSP 模拟


The Morning Star

统计 $ x,y,x-y,x+y $

开 $ long long $


Ntarsis'Set

考场降智

删除数实质是降低排名.
显然答案有单调性,直接二分答案.每次减小排名.判断是否合法.

Code
#include<cstdio>

#define int long long

using namespace std;
const int N=2e5+5;

inline int read(){
    int x=0,f=1;
    char ch=getchar();

    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

int n,k;
int a[N];

int check(int x){
    int i=n,K=k;

    while(K--){
        while(a[i]>x)
            i--;
        x-=i;
    }
    return x>0;
}

void work(){
    n=read(),k=read();

    for(int i=1;i<=n;i++)
        a[i]=read();
    
    if(a[1]!=1){
        printf("1\n");
        return ;
    }

    int l=1,r=n*k+n;
    int ans=r;

    while(l<=r){
        int mid=(l+r)>>1;

        if(check(mid)){
            r=mid-1;
            ans=mid;
        }else{
            l=mid+1;
        }
    }

    printf("%lld\n",ans);
}

signed main(){
    // freopen("set_.in","r",stdin);

    int T=read();

    while(T--){
        work();
    }
    return 0;
}

删除不好实现,但我们知道答案之后位置为1.我们可以从最后状态往回加.每次操作查看有多少个 $ a_i-i<ans $


Team Work

感谢打表log的式子.

打表式的证明

\[设 f(n,k) 为 最后答案 \]

\[f(n,k) = \sum _{i=1}^{n} C_{n}^{i} i^k \]

\[f(n,k) = n \sum _{i=1}^{n} C_{n-1}^{i-1} i^{k-1} \]

\[C_{n}^{i} = ( C_{n-1}^{i}+ C_{n-1}^{i-1} ) \]

\[f(n,k) = n \sum _{i-1}^{n} C_{n}^{i} i^{k-1} - C_{n-1}^{i} i^{k-1} =n*(f(n,k)-f(n-1,k)) \]

\[f(n,0) = 2^{n}-1 \]

还有斯特林数做法.


Make Equal

恶心的DP.

令最大值加上\(x\),$ 答案是 \sum _{i=1}^{n} popcount(x+max-a_i) 的最小值 $

我们令 $ a_i=max-a_i $, 我们直接决策 x 就好 . 按为考虑DP , 发现其会被进位影响,但我们不能保存所有进位情况.我们可以发现越大越容易进位,所以我们按第j从大到小排序就好,然后只要记录上一位进位情况.

$ 设 dp[i][j] 是前i为有j个进位的最优解,有四种情况. $

设 \(cnt\)是这一位为1的个数,tot是前\(j\)为1的个数.

1.上一次进位,这一位为 1 个数是 \(tot\)

2.上一次进位,这一次为 0 的个数 \(j-tot\)

3.上一次不进位,这一位为 1 个数是 \(cnt-tot\)

4.上一次不进位,这一次为 0 的个数 \((n-j)-(cnt-tot)\)

考虑转移

1.\(x\) 这一位为1。1,2,3进位,1,4为1.

\(dp[i+1][tot+(j-tot)+(cnt-tot)]=min(dp[i+1][tot+(j-tot)+(cnt-tot)],dp[i][j]+tot+(n-j)-(cnt-tot))\)

2.\(x\) 这一位为0。1进位,2,3为1.

\(dp[i+1][tot]=min(dp[i+1][tot],dp[i][j]+(j-tot)+(cnt-tot))\)

Code
#include<cstdio>
#include<algorithm>

#define int long long 

using namespace std;
const int N=1e5+5;

inline int read(){
    int x=0,f=1;
    char ch=getchar();

    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

int n;
int a[N],mx;
int dp[65][N];
int nowk;

bool cmp(int x,int y){
    return (x&((1ll<<nowk)-1))>(y&((1ll<<nowk)-1));
}

bool cmp1(int x,int y){
    return x>y;
}

signed main(){
    n=read();

    for(int i=1;i<=n;i++)
        a[i]=read();
    
    sort(a+1,a+1+n,cmp1);

    for(int i=n;i>=1;i--)
        a[i]=a[1]-a[i];

    for(int i=0;i<=62;i++){
        for(int j=0;j<=n;j++){
            dp[i][j]=1e15;
        }
    }
    dp[0][0]=0;

    for(int i=0;i<=61;i++){
        nowk=i;

        if(i)
            sort(a+1,a+1+n,cmp);
        
        // for(int j=1;j<=n;j++)
        //     printf("%lld ",a[i]);
        // printf("\n");

        int cnt=0,tot=0;
        int k=(1ll<<i);

        for(int j=1;j<=n;j++)
            cnt+=(a[j]&k)?1:0;
        
        for(int j=0;j<=n;j++){
            tot+=(a[j]&k)?1:0;

            // printf("%lld \n",tot);
            dp[i+1][j+cnt-tot]=min(dp[i+1][j+cnt-tot],dp[i][j]+tot+(n-j)-(cnt-tot));
            dp[i+1][tot]=min(dp[i+1][tot],dp[i][j]+(j-tot)+(cnt-tot));
        }
    }

    printf("%lld ",dp[62][0]);

    return 0;
}

标签:cnt,ch,15,int,dp,tot,进位,CSP,模拟
From: https://www.cnblogs.com/yszy/p/17612647.html

相关文章

  • CSP-J/S第一轮初赛 ~持续更新~
    CSP-J/S初赛2022更新的初赛知识汇总基础算法链表插入删除数据,操作数据O(1),遍历是O(n),可以进行动态调整。指针指向的是上下节点,链表储存数据下一个节点上一个节点。动态调整:插入一定量的节点,进行调整。插入节点:考虑信息覆盖(这些信息后面是否会再被用到)。寻找和读取比较慢......
  • CSP模拟15
    CSP模拟15T1CF1850GTheMorningStar水题但是考场写挂了直接写阶乘会\(RE\)(这里\(A\)阶乘可以优化成两个数相乘)可以分解为4种不同斜率的直线用\(map\)存(点击查看代码#include<iostream>#include<cstdio>#include<map>#include<cstring>usingnamespacestd;#de......
  • 2023.8 模拟赛日志
    2023暑假集训ab班day1127round。预期:\(0+25+0=25\)实际:\(80+20+0=100\)题目:23ab-day1划(待写)不会做,搞了很久最后逐一假掉。竟然有分。题解是一些恶心的区间分类,比较简单,可惜了。好像有很多做法23ab-day1Heinrich树论科技,跳过。写了暴力换根。23ab-day1朝花夕拾......
  • 【考后总结】8 月 CSP-S 模拟赛 2
    8.7CSP模拟15只因你太美-蔡徐坤>只因你太美baby只因你太美baby>>只因你实在是太美baby只因你太美baby>>迎面走来的你让我如此蠢蠢欲动>>这种感觉我从未有>>CauseIgotacrushonyouwhoyou>>你是我的我是你的谁>>再多一眼看一眼就会爆......
  • Cilium系列-15-7层网络CiliumNetworkPolicy简介
    系列文章Cilium系列文章前言今天我们进入Cilium安全相关主题,介绍CiliumNetworkPolicies相比于Kubernetes网络策略最大的不同:7层网络策略能力.CiliumNetworkPolicy7层能力CiliumNetworkPolicy与标准NetworkPolicy的最大区别之一是支持L7协议感知规则。在......
  • ThinkPad P15vGen2 拆解评析
    ThinkPadP15vGen2拆解评析夜之子  5人赞同了该文章准备工具:3.0规格十字螺丝刀、塑料撬棒。1.用螺丝刀拧下后盖全部螺丝,从CD面接缝处用撬棒划开即可打开后盖。注:后盖螺丝均为防脱设计,拧松即可。2.内部全貌。3.内存、硬盘对应位置均有黑色麦拉......
  • Siemens 西门子S7-1200 PLC模拟量控制变频器
    一、任务目标该任务是关于西门子1200PLC模拟量应用案例。西门子S7-1200PLC的模拟量功能可以控制电动阀、变频器等外部设备,也可以采集传感器的温度、压力、液位、流量等。本任务主要使用的是模拟量控制台达变频器从而控制电机的转速。二、任务描述某设备厂,需要对设备进行散......
  • Siemens 西门子S7-200SMART PLC 自编模拟量输入结构化编程并生成库
    说到模拟量,对于从事工控行业的人员并不陌生,在使用S7-200SMARTPLC模拟量时,系统自带模拟考库文件,不需要自己去编写转换程序,直接调用库文件就可以使用了,那么如何通过公式自己编写模拟量输入转换程序呢?接下来就带大家来编写。01模拟量输入转换公式02参数化模拟量输入转换程序......
  • Cilium系列-15-7层网络CiliumNetworkPolicy简介
    系列文章Cilium系列文章前言今天我们进入Cilium安全相关主题,介绍CiliumNetworkPolicies相比于Kubernetes网络策略最大的不同:7层网络策略能力.CiliumNetworkPolicy7层能力CiliumNetworkPolicy与标准NetworkPolicy的最大区别之一是支持L7协议感知规则。......
  • 代码随想录算法训练营第十一天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
    20.有效的括号    卡哥建议:讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。 大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。   题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%8......