写作绅士,读作丧尸 X岛揭示板
顺猴者昌 逆猴者亡 首页版规 |用户系统 |移动客户端下载 | 丧尸路标 | | 常用图串及路标 | 请关注 公众号:【矛盾苇草】| 人,是会思考的芦苇
常用串:·豆知识·跑团板聊天室·公告汇总串·X岛路标

No.65731962 - 无标题 - 技术宅


回应模式
No.65731962
名 称
E-mail
标题
颜文字
正文
附加图片
•程序语言、压制投稿、视频制作以及各计算机领域的技术问题
•我觉得还是CSDN靠谱一点
•本版发文间隔为15秒。

无标题 无名氏 2025-04-03(四)20:28:36 ID:f5rpFwo [举报] [订阅] [只看PO] No.65731962 [回应] 管理
我现在有一个长度为1E6的0/1串保存在txt文件中,其中0和1分别由5E5个。现在要求你写一条代码(我建议你用C)转换其中几个0/1的位置使得每一类字符后有恰好50%的概率出现0/1;最后一个字符的“后一个字符”是第一个字符。
另外,这类代码的时间复杂度大概应该怎么算?
无标题 无名氏 2025-04-03(四)20:34:36 ID:XLhPaSs [举报] No.65732007 管理
所以不管输入,直接输出1m的010101就好了?( ゚∀。)
无标题 无名氏 2025-04-03(四)20:35:54 ID:f5rpFwo (PO主) [举报] No.65732018 管理
>>No.65732007
不行的
你这样子做的话,0后出现1的概率是100%;1后面出现0的概率是100%
无标题 无名氏 2025-04-03(四)20:37:20 ID:f5rpFwo (PO主) [举报] No.65732037 管理
迪克浦西只给出了最暴力的解决方法,想看看朱军怎么看。
无标题 无名氏 2025-04-03(四)21:31:43 ID:tzTAlP4 [举报] No.65732697 管理
>>No.65732007
00110011(指正
无标题 无名氏 2025-04-04(五)01:30:09 ID:Gs2SdhS [举报] No.65734669 管理
首先肯定得问最小次数,其次转换是交换位置吗
无标题 无名氏 2025-04-04(五)01:34:56 ID:Gs2SdhS [举报] No.65734687 管理
复杂度一定是o(n),题目其实就是通过一些操作使换上联通的白序列个数为n/4(白黑序列数一定相等,题目仅当n整除4时有解)
剩下就看操作的定义,如果是交换的话一次操作可以让序列数+-1或2。至于如何构造及证明感觉还得想想,要是cf估计贪心就交上去了
无标题 无名氏 2025-04-04(五)02:00:05 ID:Gs2SdhS [举报] No.65734785 管理
感觉显然贪心构造就一定有解
无标题 无名氏 2025-04-04(五)02:01:50 ID:Gs2SdhS [举报] No.65734787 管理
>>No.65734785
构造出步数为ceil(abs(当前序列数-n/4)/2)的最优解
无标题 无名氏 2025-04-04(五)09:13:12 ID:F7q7l89 [举报] No.65735534 管理
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 1000000

int main() {
char s[N];
FILE *fp = fopen("input.txt", "r");
if (!fp) {
perror("Error opening file");
return 1;
}
if (fread(s, 1, N, fp) != N) {
perror("Error reading file");
fclose(fp);
return 1;
}
fclose(fp);

int A = 0, B = 0, C = 0, D = 0;
int *zeros = malloc(N * sizeof(int));
int num_zeros = 0;
int *ones = malloc(N * sizeof(int));
int num_ones = 0;

// 统计转移次数并收集0->0和1->1的位置
for (int i = 0; i < N; i++) {
char current = s[i];
char next = s[(i + 1) % N];
if (current == '0') {
if (next == '0') {
A++;
zeros[num_zeros++] = i;
} else {
B++;
}
} else {
if (next == '1') {
D++;
ones[num_ones++] = i;
} else {
C++;
}
}
}

int k = A - 250000;
if (k != 0) {
if (k > 0) {
// 需要减少0->0和1->1的转移
if (num_zeros < k || num_ones < k) {
fprintf(stderr, "Not enough 0->0 or 1->1 transitions to adjust.\n");
free(zeros);
free(ones);
return 1;
}
for (int i = 0; i < k; i++) {
int iz = zeros[i];
s[(iz + 1) % N] = '1';
int io = ones[i];
s[(io + 1) % N] = '0';
}
} else {
// k < 0,需要增加0->0和1->1的转移
int k_abs = -k;
int *zero_ones = malloc(N * sizeof(int));
int num_zo = 0;
int *one_zeros = malloc(N * sizeof(int));
int num_oz = 0;

for (int i = 0; i < N; i++) {
char current = s[i];
char next = s[(i + 1) % N];
if (current == '0' && next == '1') {
zero_ones[num_zo++] = i;
} else if (current == '1' && next == '0') {
one_zeros[num_oz++] = i;
}
}

if (num_zo < k_abs || num_oz < k_abs) {
fprintf(stderr, "Not enough 0->1 or 1->0 transitions to adjust.\n");
free(zero_ones);
free(one_zeros);
free(zeros);
free(ones);
return 1;
}

for (int i = 0; i < k_abs; i++) {
int iz = zero_ones[i];
s[(iz + 1) % N] = '0';
int io = one_zeros[i];
s[(io + 1) % N] = '1';
}

free(zero_ones);
free(one_zeros);
}
}

free(zeros);
free(ones);

// 写入结果
fp = fopen("output.txt", "w");
if (!fp) {
perror("Error opening output file");
return 1;
}
fwrite(s, 1, N, fp);
fclose(fp);

return 0;
}
无标题 无名氏 2025-04-04(五)09:17:02 ID:BJv8RtR [举报] No.65735557 管理
X岛许愿版( ゚∀。)
无标题 无名氏 2025-04-04(五)09:23:26 ID:p8pNIRi [举报] No.65735595 管理
>>No.65735557
蚌埠住了哈哈哈哈
无标题 无名氏 2025-04-04(五)09:47:02 ID:Gs2SdhS [举报] No.65735686 管理
>>No.65735557
可惜许愿效果不佳,只有我这种只会嘴炮的和比较暴力的

UP主: