QOJ.ac

QOJ

時間限制: 1 s 記憶體限制: 1024 MB 總分: 150

#9099. Wielokąt

统计

Rozważmy wielokąt $P$ o poziomych i pionowych bokach oraz $N$ wierzchołkach. Boki mogą stykać się tylko końcami, a w każdym wierzchołku spotykają się końce dokładnie dwóch boków. Idąc wzdłuż boków $P$ przeciwnie do ruchu wskazówek zegara, w każdym wierzchołku skręcamy w lewo lub w prawo. Oznaczmy skręt w lewo przez $L$, a w prawo przez $R$. Wtedy napis złożony z $L$ i $R$ opisuje wielokąt. Na przykład wielokąt z rysunku 1 opisuje napis

$LLRLLRRLLRLLRLLRRLLR$

Opisując wielokąt napisem, zawsze zaczynamy od górnego końca jego najbardziej lewego boku. Ten znak to zawsze $L$.

problem_9099_f6132c9007fa1c696efb4275f29cdf94.png

Rysunki 1 i 2

Wielokąt opisany podanym napisem musi spełniać następujący warunek: dla dowolnej pionowej prostej $V$ istnieją co najwyżej dwa punkty przecięcia $V$ z wnętrzami poziomych boków wielokąta (bez ich końców).

Dla wielokąta $P$ niech $B(P)$ oznacza najmniejszy prostokąt o poziomych i pionowych bokach zawierający $P$. Wyznaczają go pionowe i poziome proste pokrywające się z najbardziej lewym, prawym, górnym i dolnym bokiem $P$ (rysunek 2).

Dla danego napisu długości $N$, złożonego z $L$ i $R$, rysujemy opisany nim wielokąt $P$ spełniający powyższy warunek. Każdy bok $P$ musi mieć długość całkowitą. Napisz program minimalizujący pole $B(P)$ i wypisujący to minimum.

Należy zaimplementować następującą funkcję dla programu oceniającego.

int polygon(string S);

Funkcja przyjmuje napis $S$ długości $N$, którego każdy znak to $L$ lub $R$. Wśród wielokątów $P$ opisanych przez $S$ należy znaleźć taki, który minimalizuje pole $B(P)$, i zwrócić to pole.

Szczegóły implementacji

Prześlij dokładnie jeden plik o nazwie polygon.c lub polygon.cpp. Musi on implementować następującą funkcję.

int polygon(string S);

Funkcja musi działać zgodnie z powyższym opisem. Można tworzyć inne funkcje do użytku wewnętrznego. Przesłany kod nie może wykonywać operacji wejścia/wyjścia ani uzyskiwać dostępu do innych plików.

Przykładowy program oceniający

Udostępniony program oceniający czyta wejście w następującym formacie.

  • Wiersz 1: $N$ (długość napisu).

  • Wiersz 2: napis $c_1c_2\cdots c_N$ długości $N$ ($c_1=L$ oraz $c_i=L$ lub $R$ dla $2\le i\le N$).

Udostępniony program oceniający wypisuje wartość zwróconą przez polygon.

Ograniczenia

  • Napis wejściowy składa się z $L$ i $R$.

  • Zawsze istnieje co najmniej jeden wielokąt opisany napisem wejściowym, który spełnia powyższe warunki.

  • $4 \le N \le 800$.

Podzadania

1 (20 punktów)

  • $N \le 10$.

2 (36 punktów)

  • $N \le 40$.

3 (21 punktów)

  • $N \le 100$.

4 (73 punktów)

  • Brak dodatkowych ograniczeń.

Przykład

Wejście 1

8
LLLRRLLL

Wyjście 1

6

Wejście 2

20
LLRLLRRLLRLLRLLRRLLR

Wyjście 2

15

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.