На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение



Не зарегистрирован
ссылка на сообщение  Отправлено: 27.02.22 08:13. Заголовок: задача 26-66


Пытался решить задачу 26-66 "сканирующей прямой" на СИ++ с помощью структуры map. Но количество отрезков получается не 10358, а почему-то 10416.
 
#include <iostream>
#include <map>
#include <fstream>

struct ser{//structura budet hranit' L (esli nachalo otrezka) R (esli konec)
char lit;
int count;// kolichestvo otrezkov s odinakovoj granicej
};

using namespace std;
int main(){
ifstream cin;
cin.open("26-66.txt");

map <long long int, ser> m;

long long int n,k,i,x,y,ma=100000000000,mi=0,kol=0;
cin>>n>>k;
for (i=0;i<n;i++){
cin>>x>>y;
if (y==0)//v sluchae y=0 pravuju granicu delaem "daleko" vpravo
y=ma;
m[x].lit='L';
m[x].count=m[x].count+1;
m[y].lit='R';
m[y].count=m[y].count+1;
}

for (auto w:m){//realizuem algoritm skaniruju prjamoj
if (w.second.lit=='L'){
kol=kol+w.second.count;
if (w.first>=k && kol>mi)
mi=kol;
}
else
kol=kol-w.second.count;
}

cout<<mi<<endl;//otvet pochemu-to 10416 vmesto 10358
} // hotja dlja primera v uslovii otvet daet pravil'nyj



Спасибо: 0 
Цитата Ответить
Ответов - 3 [только новые]





Не зарегистрирован
ссылка на сообщение  Отправлено: 27.02.22 08:25. Заголовок: Еще один непонятный ..


Еще один непонятный момент: написал практически такой же алгоритм на Питоне (этим языком владею очень плохо), ответ получился 10511
 
f = open('26-66.txt')
n,k=map(int, f.readline().split())
a=[]
b=[]
pred=1000000000000
for i in range(n):
x,y=map(int,f.readline().split())
if x in b:
j=b.index(x)
a[j][1]=a[j][1]+1
else:
b.append(x)
a.append([x,1,'L'])
if y==0:
y=pred
if y in b:
j=b.index(y)
a[j][1]=a[j][1]+1
else:
b.append(y)
a.append([y,1,'R'])

a.sort(key = lambda z: z[0])
nn=len(a)
kol=0
mm=0
for i in range(nn):
if a[i][2]=='L':
kol=kol+a[i][1]
if a[i][0]>=k and kol>mm:
mm=kol
else:
kol=kol-a[i][1]
print(mm)


Спасибо: 0 
Цитата Ответить



Не зарегистрирован
ссылка на сообщение  Отправлено: 27.02.22 12:53. Заголовок: На заключительном эт..


На заключительном этапе сделал все команды ветвления независимыми, результат "улучшился" на 6: вместо 10416 стал 10410.
 #include <iostream>  
#include <map>
#include <fstream>

struct ser{//structura budet hranit' L (esli nachalo otrezka) R (esli konec)
char lit;
int count;// kolichestvo otrezkov s odinakovoj granicej
};

using namespace std;
int main(){
ifstream cin;
cin.open("26-66.txt");

map <long long int, ser> m;

long long int n,k,i,x,y,ma=100000000000,mi=0,kol=0;
cin>>n>>k;
for (i=0;i<n;i++){
cin>>x>>y;
if (y==0)//v sluchae y=0 pravuju granicu delaem "daleko" vpravo
y=ma;
m[x].lit='L';
m[x].count=m[x].count+1;
m[y].lit='R';
m[y].count=m[y].count+1;
}

for (auto w:m){//realizuem algoritm skaniruju prjamoj
if (w.second.lit=='R')
kol=kol-w.second.count;
if (w.first>=k && kol>mi)
mi=kol;
if (w.second.lit=='L')
kol=kol+w.second.count;
}

cout<<mi<<endl;//otvet pochemu-to 10410 vmesto 10358
} // hotja dlja primera v uslovii otvet daet pravil'nyj



Спасибо: 0 
Цитата Ответить
Администратор




Сообщение: 3360
ссылка на сообщение  Отправлено: 06.03.22 22:59. Заголовок: На сайте есть авторс..


На сайте есть авторские решения всех 26-х задач, сравнивайте с ними.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 1938
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет