【7.21-26】代码源 - 【好序列】【社交圈】【namonamo】

#613. 好序列

题意:有一个长为 n n n 的序列 A 1 , A 2 , ⋯   , A n A_1,A_2,\cdots,A_n A1,A2,,An 。定义一个序列 { A } \{A\} {A} 是好的, 当且仅当他的每一个子区间 [ l , r ] [l,r] [l,r] 满足,至少存在一个元素 x x x 仅出现了一次。 ( n ≤ 2 × 1 0 5 ) (n\leq 2\times 10^5) (n2×105)

思路:启发式分治。详见【启发式分治】启发式合并的逆思想

AC代码:http://oj.daimayuan.top/submission/299119


#606. 社交圈

题意:现在有 N N N 个人,每一个人都不想周围的人坐得离他很近,所以在他的左边要放 L i L_i Li 张空椅子,右边要放 R i R_i Ri 张空椅子,同时每个人自己要坐 1 1 1 张椅子。现在他们要坐成若干个圈,请问最少要放多少张椅子(包括每个人自己坐的椅子)?

思路:把 { L } , { R } \{L\},\{R\} {L},{R} 排序匹配即可,这样贪心一定最小。那么这种匹配方法是否有解呢,一定有解。因为这样重组匹配类似于置换,而置换可以拆分成图论里的若干个环,和题意 若干个圈 是一样的。

AC代码:http://oj.daimayuan.top/submission/298809


#678. namonamo

题意:给定字符串,问是否能拆分为两个相等的子序列。 ∣ S ∣ ≤ 40 |S|\leq 40 S40

题解:(折半搜索) 代码源每日一题Div1 namonamo

思路:我们可以爆搜,但是 O ( 2 40 ) O(2^{40}) O(240) 不可行。我们可以使用折半搜索,对序列的前半部分和后半部分分别爆搜,然后枚举左边的搜索结果,在右边查询,时间复杂度 O ( 2 20 × log ⁡ 2 20 ) O(2^{20}\times \log 2^{20}) O(220×log220)

AC代码:http://oj.daimayuan.top/submission/299579

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: c语言中,你可以使用for循环来遍历seita的所有可能取值,并在每次迭代时计算q0_1和q0_2的值。然后,你可以找到q0_1和q0_2最接近0的值,并记录下对应的seita值。 例如: ``` #include <stdio.h> #include <math.h> int main() { double hk = 0.0; double seita = 0.0; double q0_1 = 0.0; double q0_2 = 0.0; double min_diff = 1000000000.0; // 设置一个极大的初始值 double min_seita = 0.0; // 用于记录最接近时的seita值 for (seita = 0.0; seita <= 7.21; seita += 0.01) { // 遍历所有可能的seita值 q0_1 = hk * (1 / pow(seita, 0.25)) * seita; q0_2 = 2340.2650 * (7.21 - seita); double diff = fabs(q0_1 - q0_2); // 求出q0_1和q0_2的差值的绝对值 if (diff < min_diff) { // 如果当前的差值比之前的小 min_diff = diff; // 更新最小差值 min_seita = seita; // 记录最接近时的seita值 } } printf("seita = %f, q0_1 = %f, q0_2 = %f\n", min_seita, q0_1, q0_2); return 0; } ``` 在这段代码中,我们使用了for循环来遍历seita的所有可能取值,并在每次迭代时计算q0_1和q0_2的值。然后,我们比较q0_1和q0_2的差值的绝对值,并找到最小值,最后输出最接 ### 回答2: 根据给定的公式,我们需要编写程序来求出变量seita取值范围为[0, 7.21]时,使得q0_1和q0_2的值最接近的seita的值。 首先,我们可以设定一个初始值best_seita,用来保存当前使得q0_1和q0_2最接近的seita的值。初始时,我们可以将best_seita设定为0,并计算相应的q0_1和q0_2的值。 接下来,我们采用遍历的方式,从0到7.21的范围内,以较小的步长进行迭代计算。在每一次迭代中,我们用当前的seita值计算q0_1和q0_2。如果当前的q0_1和q0_2的差值比之前的最小差值还要小,则将当前的seita值更新为best_seita,并更新最小差值。 最后,程序运行完成后,best_seita的值即为使得q0_1和q0_2最接近时的seita值。 下面是一个示例程序的代码: ```c #include <stdio.h> #include <math.h> int main() { double best_seita = 0; double min_diff = __DBL_MAX__; // 设置初始最小差值为最大浮点数 for (double seita = 0; seita <= 7.21; seita += 0.001) { double q0_1 = hk * (1 / pow(seita, 0.25)) * seita; double q0_2 = 2340.2650 * (7.21 - seita); double diff = fabs(q0_1 - q0_2); // 计算当前q0_1和q0_2的差值的绝对值 if (diff < min_diff) { best_seita = seita; min_diff = diff; } } printf("使得q0_1和q0_2值最接近时的seita的值为:%f\n", best_seita); return 0; } ``` 以上就是一个求解最接近的seita值的C语言程序。注意,为了提高精度,我们在每次迭代中使用了较小的步长0.001。实际使用时,可以根据需要进行调整。 ### 回答3: 要求编写程序求出q0_1和q0_2最接近时seita的值。 首先,我们需要确定seita的取值范围为[0,7.21]。由于seita是一个变量,我们需要以一定的精度遍历这个范围。 首先,定义一个变量step,表示遍历的步长。为了保证精度,我们可以将seita的范围划分为多个小区间,然后在每个小区间内进行遍历。 假设步长为0.001,则需要遍历的次数为(7.21-0)/0.001 = 7210次。 我们可以使用一个循环来遍历这个范围。在每次遍历中,计算q0_1和q0_2的值,然后判断与之前的最接近值的差距,如果更接近,则更新最接近的值和seita的取值。 下面是一个伪代码示例: ```c double q0_1_min = MAX_DOUBLE; double q0_2_min = MAX_DOUBLE; double seita_min = 0; double hk = 1.0; // hk值需要根据实际情况确定 for (double seita = 0; seita <= 7.21; seita += 0.001) { double q0_1 = hk * (1 / pow(seita, 0.25)) * seita; double q0_2 = 2340.2650 * (7.21 - seita); double diff_q0_1 = fabs(q0_1 - q0_1_min); double diff_q0_2 = fabs(q0_2 - q0_2_min); if (diff_q0_1 < fabs(q0_1_min - q0_2_min) || diff_q0_2 < fabs(q0_1_min - q0_2_min)) { q0_1_min = q0_1; q0_2_min = q0_2; seita_min = seita; } } printf("q0_1最接近时的seita值:%f\n", seita_min); printf("q0_2最接近时的seita值:%f\n", seita_min); ``` 通过遍历并比较差值,最后输出q0_1和q0_2最接近时的seita值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值