CF_305_C. Ivan and Powers of Two

本文介绍了一种通过操作二进制位来解决特定数学问题的算法。输入一系列非负整数,目标是最小化地增加整数数量,使所有整数能表示为2的幂次形式。算法通过统计二进制位上的零来实现这一目标。
部署运行你感兴趣的模型镜像

Sample test(s)
input
4
0 1 1 1
output
0
input
1
3
output
3

题目大致意思:

输入a[1],a[2]....a[n]n个非负整数,再添加最少数目的这样整数使得所有的整数以2为底的整数之后满足2^p(p>=0)的形式。

解题思路:

将输入的各个整数a[i]看看成整数的第a[i]个非零二进制位,其余为则为0,然后统计最后一个非零二进制为前面0的个数,即为最小值。例如:输入4个数分别为0,1,1,1则第0为为1,输入的1个数为3,故第1位为3%1,留下的3/2作为下位的进位。所以最终的和为111(2)不需要添加任何数。

代码:

首先对输入数据按升序排序,便于统计相同位数的个数;

分别建立列表存储不同的位,及相同该位的个数,并指向下一列

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define N 100010
 4 typedef int  ll;
 5 ll a[N];
 6 typedef struct node
 7 {
 8     ll a;
 9     ll mem;
10     struct node* next;
11 } Node;
12 typedef Node *List;
13 int cmp(const void *a,const void*b)
14 {
15     return *(ll *)a-*(ll *)b;
16 }
17 int main(void)
18 {
19     ll n,i,j,count=0,sum=0,carry=0;
20     List head,current,prev;
21     head=NULL;
22     scanf("%d",&n);
23     for(i=1; i<=n; i++)
24         scanf("%d",&a[i]);
25     qsort(&a[1],n,sizeof(ll),cmp);//这里值得注意,排序应当从a[1]开始,
26     for(i=1; i<=n; i++)
27     {
28         current=(List)malloc(sizeof(Node));
29         current->next=NULL;
30         current->mem=0;
31         current->a=a[i];
32         if(head==NULL)
33             head=current;
34         else
35             prev->next=current;
36         for(j=i; j<=n; j++)
37         {
38             if(a[j]==a[i])
39                 (current->mem)++;
40             else
41                 break;
42         }
43         i=j-1;//循环变量退后一位
44         prev=current;//结构指针指向更新
45     }
46     sum+=head->a;//sum应当加上第一个非零位前面的零位,
47     while(head!=NULL)
48     {
49         count=carry+head->mem;//进位数加上当前位的重复数
50         i=head->a;
51         if(head->next==NULL)//当前为链表最后一项时终止循环
52             break;
53         else
54         {
55             while(count&&i<((head->next)->a))
56             {
57                 sum+=!(count%2);
58                 count/=2;
59                 i++;
60             }
61             carry=count;
62         }
63         sum+=(head->next)->a-i;//加上两个位之间的闲置0个数,
64         head=head->next;
65     }
66     while(count)//针对最后一个位进行统计,直至count为0.
67     {
68         sum+=!(count%2);
69         count/=2;
70     }
71     printf("%d\n",sum);
72     return 0;
73 }

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
WITH email AS ( SELECT tenant_id, short_session_id, session_id, session_subject, product_id, strategy_id, customer_id, customer_email, staff_id, first_staff_id, session_status, offline_status, queue_status, session_type, email_group_id, first_email_group_id, CASE WHEN DATE(start_time) < '2025-05-22' THEN FROM_UNIXTIME(UNIX_TIMESTAMP(start_time) - 3600) ELSE start_time END AS start_time, CASE WHEN DATE(end_time) < '2025-05-22' THEN FROM_UNIXTIME(UNIX_TIMESTAMP(end_time) - 3600) ELSE end_time END AS end_time, CASE WHEN DATE(create_time) < '2025-05-22' THEN FROM_UNIXTIME(UNIX_TIMESTAMP(create_time) - 3600) ELSE create_time END AS create_time FROM lods.lods_smartxma_workorder_email_session WHERE customer_email NOT IN ( '1178627646@qq.com', 'advertise-noreply@support.facebook.com', '360541391@qq.com', '554041631@qq.com', 'ivan.gonzalezcruz@icloud.com', 'notification@facebookmail.com', 'adrianaguilera834@gmail.com', 'reminders@facebookmail.com', 'zjy703@qq.com', 'xueshi_oo@163.com', 'miaandrea2530@gmail.com', 'jiayannan0724@126.com', 'dani.coyolxauhqui63@gmail.com', 'miaandrea2530@gmail.com', 'miguel.cetis37fv@gmail.com', 'Miki.cekan63@gmail.com', 'miguel.hernandez21918@gmail.com', 'Ivan.gonzalezcruz@icloud.com', 'ivangzcruz@hotmail.com', 'Adrianaguilera834@gmai.com', 'Cobranzaprevia925@gmail.com', 'rtrinidadmaldonado@gmail.com','zjy703@qq.com', 'jiaxiong.wen@xiaolongcloud.com', '360541391@qq.com', 'suhuanzheng7784877@163.com' ) and customer_email not like '%qq.com' and customer_email not like '%163.com' and customer_email not like '%xiaolongcloud.com' and session_subject not like '%Prueba%' and ( session_subject NOT RLIKE '[\\u4e00-\\u9fa5]' or session_subject like '%外部邮件%') and session_subject not like '%test%' ), note ( SELECT DISTINCT session_id , field_val from lods.lods_smartxma_workorder_email_session_question_ext where field_val is not null and field_val!='' and field_name= 'Notas de servicio' ), response_time AS ( SELECT session_id, MIN(send_msg_time) AS f_send_msg_time FROM lods.lods_smartxma_workorder_email_session_message WHERE from_terminal = 'kf_web' AND msg_type = 1 GROUP BY session_id ), xiaojie AS ( SELECT * FROM lods.lods_smartxma_basic_basic_summary ), bf AS ( SELECT session_id, SPLIT(question, '-')[0] AS brief_sum1, SPLIT(question, '-')[1] AS brief_sum2, case when to_date(create_time)>='2025-07-24' then '' else SPLIT(question, '-')[2] end AS brief_sum3 FROM lods.lods_smartxma_workorder_email_session_question ),email_base AS ( SELECT *, LAG(create_time) OVER ( PARTITION BY customer_email ORDER BY create_time ) AS prev_time FROM email ), email_groups AS ( SELECT *, -- 邮箱内分组 (48小时连续) SUM(CASE WHEN prev_time IS NULL OR unix_timestamp(create_time) - unix_timestamp(prev_time) > 172800 THEN 1 ELSE 0 END) OVER ( PARTITION BY customer_email ORDER BY create_time ) AS group_id, -- 标记重复进线 CASE WHEN prev_time IS NOT NULL AND unix_timestamp(create_time) - unix_timestamp(prev_time) <= 172800 THEN '48h重复进线' ELSE NULL END AS repeat_mark FROM email_base ), group_info AS ( SELECT customer_email, group_id, -- 正确获取每个组的最早创建时间 MIN(create_time) AS group_start_time ,max(start_time) as group_max_time FROM email_groups GROUP BY customer_email, group_id ), -- 全局问题ID分配 global_groups AS ( SELECT customer_email, group_id, group_start_time,group_max_time, ROW_NUMBER() OVER (ORDER BY group_start_time) AS question_id FROM group_info ) INSERT OVERWRITE TABLE dm_opr.dm_opr_email_realtime_df PARTITION(dt) SELECT distinct eg.tenant_id, eg.short_session_id, eg.session_id, eg.session_subject, eg.product_id, eg.strategy_id, eg.customer_id, eg.customer_email, eg.staff_id, eg.first_staff_id, eg.session_status, eg.offline_status, eg.queue_status, eg.session_type, eg.email_group_id, eg.first_email_group_id, eg.start_time, eg.end_time, eg.create_time, eg.repeat_mark, gg.question_id, gg.group_start_time,gg.group_max_time, f.unique_id AS uniqueid, case when SPLIT(b.channel_name, '_')[0] ='Ala' then 'ala' else SPLIT(b.channel_name, '_')[0] end AS app_code, response_time.f_send_msg_time, bf.brief_sum1, bf.brief_sum2, bf.brief_sum3, note.field_val as notas , UNIX_TIMESTAMP(response_time.f_send_msg_time) - UNIX_TIMESTAMP(eg.start_time) AS avg_responstime, g.name AS staff_name, CASE WHEN w.unique_id IS NOT NULL THEN '凭证' ELSE '咨询' END AS type , case when oc.call_id is not null and oc.answer_time is not null then '已外呼客户接起' when oc.call_id is not null then '已外呼未接起' else '未外呼' end as type2, case when sw.session_id is not null then '有号码' else '无号码' end as type3, date(eg.create_time) as dt FROM email_groups eg JOIN global_groups gg ON eg.customer_email = gg.customer_email AND eg.group_id = gg.group_id LEFT JOIN response_time ON response_time.session_id = eg.session_id LEFT JOIN bf ON bf.session_id = eg.session_id LEFT JOIN ( SELECT channel_id, channel_name FROM lods.lods_smartxma_workorder_wo_email_channel ) b ON eg.product_id = b.channel_id LEFT JOIN ( SELECT * FROM lods.lods_smartxma_basic_basic_customer_identity ) k ON k.customer_id = eg.customer_id LEFT JOIN ( SELECT distinct unique_id, default.denc2md5(email) AS email FROM dwd.dwd_ip_cust_info_df WHERE dt = REPLACE(DATE_SUB(CURRENT_DATE(), 1), '-', '') ) f ON f.email = denc2md5(eg.customer_email) LEFT JOIN ( SELECT * FROM lods.lods_smartxma_basic_basic_user_global ) g ON cast(eg.staff_id as string)= cast(g.id as string) LEFT JOIN ( SELECT distinct unique_id, app_code, mobile, create_time, body_text FROM lods.lods_smartxma_workbench_whats_app_send_record where body_text LIKE '%.com%' ------- AND send_state = '1' ) w ON w.unique_id = f.unique_id AND cast(w.create_time as string) <= cast(eg.create_time as string) left join dm_opr.dm_opr_out_call_df oc on oc.uniqueid=f.unique_id and cast(gg.group_max_time as string) <= cast(oc.room_start_time as string) left join ( SELECT distinct session_id , msg_content FROM lods.lods_smartxma_workorder_email_session_message WHERE from_terminal ='user_email' and msg_type=1 and msg_content RLIKE '\\d{10,}' -- 匹配10位及以上数字 AND NOT msg_content RLIKE '(?i)zkj\\d{10}' ) sw on sw.session_id=eg.session_id left join note on note.session_id=eg.session_id; 以上是我的逻辑中间表逻辑,下面是我的计算指标sql,我想要计算时候取源表数据来计算,指标sql该怎么修改 select to_date(create_time) as date, '总计' as brief_sum2, app_code, count(distinct customer_email) as `邮件进线客户数` from dm_opr.dm_opr_email_realtime_df WHERE to_date(create_time) >=DATE_SUB(CURRENT_DATE(), 3) and app_code='pulsar' group by 1,2,3 order by 1 desc limit 1;
11-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值