thắc mắc Giúp đỡ lập trình C.

hadata

Junior Member
Chào các bác em có bài lập trình nghĩ mãi không ra. Có bác nào hứng thú nghĩ cách với em ạ. Em cám ơn!
1598099790972.png
 

qkhanhpro

Đã tốn tiền
Chào các bác em có bài lập trình nghĩ mãi không ra. Có bác nào hứng thú nghĩ cách với em ạ. Em cám ơn! View attachment 163068
Duyệt 1 lần thôi mà fen

1111 000 1 0 111 11111

flip = false;

If (next == 1)
{
temp +=1
CompareAndAssign
}
else {
flip ? { CompareAndAssign ; temp = 0; } : { temp +=1; CompareAndAssign, !flip }
}
 
Last edited:

Saten Ruiko

Đã tốn tiền
Theo ý kiến của 1 thanh niên 5-6 năm rồi chưa đụng vào lập trình lại
Thì cứ tạo 2 biến để xác định vị trí bit 0 thứ 1 và bit 0 thứ 2 thôi. zerost, zerond
Đếm từ đầu tới bit 0 thứ 2 (zerond != 0), so sánh và gắn max, zerost = zerond, zerond = 0, count = zerond - zerost . Cứ đếm tới cuối thôi
 

shampoo

Junior Member
Tạo 1 array chứa độ dài các chuỗi bit 1 liên tiếp. Sau đó tính max của tổng 2 số liên tiếp trong array đó. KQ là max+1.
 

hadata

Junior Member
Duyệt 1 lần thôi mà fen

1111 000 1 0 111 11111

flip = false;

If (next == 1)
{
temp +=1
CompareAndAssign
}
else {
flip ? { CompareAndAssign ; temp = 0; } : { temp +=1; CompareAndAssign, !flip }
}
Bác rảnh không giải thích giùm em với ạ. Ngu quá. :cry::cry:
 

T.Dark

Member
bài này có thể giải theo cách thô sơ 2 vòng lặp. Còn cách tối ưu thì hình như sử dụng bfs hay dfs gì đó, quên mịa rồi :beat_brick:
 
#include <stdio.h>
#include <stdbool.h>
void main() {
int number = 0;
int count = 0;
int max_length = 0;
bool isChanged = false;
printf("Nhap so dang thap phan:confused:n");
scanf("%d", &number);
if (number == 0) {
max_length = 1;
}
while (number != 0) {
if (number % 2 == 1) {
count++; // bit 1
} else {
if (isChanged) {
// 2 bit 0 lien tiep thi reset counting
isChanged = false;
if (max_length < count) {
max_length = count;
}
count = 0;
} else {
// Bit 0 dau tien, lat bit
isChanged = true;
count++;
}
}
number = number >> 1;
}
if (max_length < count) {
max_length = count;
}
printf("Max = %d\n", max_length);
}

TEST:
1831935: 110111111001111111111 => 11
28623: 110111111001111 => 9
 

hadata

Junior Member
#include <stdio.h>
#include <stdbool.h>
void main() {
int number = 0;
int count = 0;
int max_length = 0;
bool isChanged = false;
printf("Nhap so dang thap phan:confused:n");
scanf("%d", &number);
if (number == 0) {
max_length = 1;
}
while (number != 0) {
if (number % 2 == 1) {
count++; // bit 1
} else {
if (isChanged) {
// 2 bit 0 lien tiep thi reset counting
isChanged = false;
if (max_length < count) {
max_length = count;
}
count = 0;
} else {
// Bit 0 dau tien, lat bit
isChanged = true;
count++;
}
}
number = number >> 1;
}
if (max_length < count) {
max_length = count;
}
printf("Max = %d\n", max_length);
}

TEST:
1831935: 110111111001111111111 => 11
28623: 110111111001111 => 9
Em học cho biết giải thuật mà bác làm như này thì chết em rồi. :byebye::byebye::byebye:
 
Em học cho biết giải thuật mà bác làm như này thì chết em rồi. :byebye::byebye::byebye:
Su dung chia lay du "%" de test bit ben phai ngoai cung la bit 0 hay 1
Neu la bit 1 thi count ++
Neu la bit 0:
- Neu la bit 0 dau tien gap thi lat bit, count ++
- Neu la bit 0 lan thu 2 thi ko lat bit nua, ma reset count, neu count ma lon hon max thi update
 

T.Dark

Member
Su dung chia lay du "%" de test bit ben phai ngoai cung la bit 0 hay 1
Neu la bit 1 thi count ++
Neu la bit 0:
- Neu la bit 0 dau tien gap thi lat bit, count ++
- Neu la bit 0 lan thu 2 thi ko lat bit nua, ma reset count, neu count ma lon hon max thi update
Sai đề bài rồi fen, thớt yêu cầu là lật 1 bit để tạo ra dãy 1 bit dài nhất có thể, không phải tìm dãy bit 1 dài nhất
 

qkhanhpro

Đã tốn tiền
Bác rảnh không giải thích giùm em với ạ. Ngu quá. :cry::cry:
https://dotnetfiddle.net/WQAslu

using System;

namespace Flip1
{
public class Program
{
static int max = 0;
static int temp = 0;
static bool flip = false;
static int recent = 0; // Nhóm 1s gần nhất

public static void Main()
{

var input = new int[] { 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
foreach (var x in input)
{
Console.WriteLine(String.Format("Temp: {0} , Max: {1}, RecentGroup: {2}",temp,max,recent));
if (x == 1)
{
temp += 1;
CompareAndAssign();
recent += 1;
}
else
{
if (!flip)
{
flip = true;
recent = 0;
temp += 1;
CompareAndAssign();
}
else
{
flip = false;
temp = recent + 1;
recent = 0;
CompareAndAssign();
}
}
};
Console.WriteLine(String.Format("Finally Temp: {0} , Max: {1}, RecentGroup: {2}",temp,max,recent));
}

public static void CompareAndAssign()
{
if (temp >= max)
{
max = temp;
}
}
}
}
Đây nhé bạn
Duyệt

Thấy 1 ? Cộng thêm vào Temp. So sánh với Max
Thấy 0 ?
=> Chưa lật cờ ? lật cờ, cộng thêm vào Temp. So sánh với Max
=> Đã lật cờ (chốt kết quả nhóm cũ) ? trả cờ, lấy temp = nhóm 1s trướt khi chốt. đi tiếp
 
Last edited:
Sai đề bài rồi fen, thớt yêu cầu là lật 1 bit để tạo ra dãy 1 bit dài nhất có thể, không phải tìm dãy bit 1 dài nhất
Khi gap bit 0 dau tien thi count++
Khi gap bit 1 sau bit 0 do thi cout van ++ ma. Chi reset khi gap bit 0 thu 2 thoi
Vi du: 10111 thi count = 5; dung nhu de bai yeu cau
 

hadata

Junior Member
Em cám ơn, các bác nhiệt tình quá. Nhân tiện cho em hỏi làm nhúng thì nên học phần nào của C ạ?
 
Top