Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2012, 11:42   #1
kostan3
- Дорогой, а ты ку
Форумчанин
 
Регистрация: 06.10.2012
Сообщений: 181
По умолчанию Телешоу (Время: 2 сек. Память: 16 Мб Сложность: 66%)

В новом интеллектуальном телешоу участнику, проходящему в суперфинал, предлагается следующая игра: на каждом из n секторов большого барабана записывается буква латинского алфавита li. После минуты на размышления игрок указывает одну из позиций на барабане i. Его выигрыш вычисляется по такому правилу: для каждой позиции j меньшее из расстояний по и против часовой стрелке от i до j, измеренное в секторах, умножается на абсолютною величину разности номеров в алфавите букв li и lj , после чего все такие величины суммируются.

А Вы можете написать программу, находящую способ получения наибольшего выигрыша?
Входные данные

Первая строка входного файла INPUT.TXT содержит натуральное число n (1 ≤ n ≤ 100000) - размер барабана. Во второй строке задаются разделенные пробелами строчные латинские буквы, записанные на барабане.
Выходные данные

В первой строке выходного файла OUTPUT.TXT выведите наибольший выигрыш, который можно получить при заданном расположении букв на барабане. Во второй строке выведите номер какого-нибудь из секторов, на который игрок должен для этого указать.
Пример
№ INPUT.TXT OUTPUT.TXT
1 4
r e a r 55
3
вот моё решение
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;


public class game_is {
public game_is{
StreamTokenizer in;
PrintWriter out;

HashMap<Character, Long> m;

public game_is() {
Locale.setDefault(Locale.US);
try {
in = new StreamTokenizer(new BufferedReader(new FileReader((new File("input.txt")))));
out = new PrintWriter(new File("output.txt"));
}
catch (Exception e) {
e.printStackTrace();
}
}

static void add(HashMap<Character, Long> m, char c, long d) {
Long i = m.get(c);
if (i == null)
i = new Long(0);
m.put(c, i + d);
}

void solve() {
tryblock:
try {
in.nextToken(); int n = (int) in.nval;
if (n == 1) {
out.println(0);
out.println(1);
out.close();
break tryblock;
}

char[] a = new char[n];

for (int i = 0; i < n; i++) {
in.nextToken(); a[i] = in.sval.charAt(0);
}

int nmax = 0;
long max = 0;

m = new HashMap<Character, Long>();

add(m, a[0], 1);
add(m, a[1], -1);

int i = 2;
int j = n - 1;
HashMap<Character, Long> s = new HashMap<Character, Long>();
add(s, a[1], 1);
while (i <= j) {
add(s, a[j], i - 1);
if (i == j)
break;
add(m, a[j], 1);
add(s, a[i], i);
add(m, a[i], -1);
i++;
j--;
}

for (i = 0; i < n; i++) {
long r = 0;
for (Map.Entry<Character, Long> e : s.entrySet())
r += Math.abs(e.getKey() - a[i]) * e.getValue();
if (max < r) {
max = r;
nmax = i;
}
for (Map.Entry<Character, Long> e : m.entrySet())
add(s, e.getKey(), e.getValue());
add(m, a[(i + 1) % n], 2);
add(m, a[(i + 1 + n / 2) % n], -1);
add(m, a[(i + 1 + (n + 1) / 2) % n], -1);
}
out.println(max);
out.println(nmax + 1);

out.close();
}
catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
game_is solution = new game_is();
solution.solve();
}
}).start();
}
}
}
НО ПОЧЕМУ-ТО Compilation error
ПИШИТ
Main.java:13: <identifier> expected
public game_is{
^
Main.java:110: class, interface, or enum expected
}
^
2 errors
ПОМОГИТЕ РАЗОБРАТЬСЯ
kostan3 вне форума Ответить с цитированием
Старый 16.10.2012, 14:34   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
public class game_is {
public game_is{
StreamTokenizer in;
PrintWriter out;

HashMap<Character, Long> m;

public game_is() {
Locale.setDefault(Locale.US);
try {
Один game_is внутри другого?
Somebody вне форума Ответить с цитированием
Старый 16.10.2012, 19:13   #3
kostan3
- Дорогой, а ты ку
Форумчанин
 
Регистрация: 06.10.2012
Сообщений: 181
По умолчанию

напиши побратски
полный код а то в яве чайник
kostan3 вне форума Ответить с цитированием
Старый 04.01.2013, 03:23   #4
programmer2013
Новичок
Джуниор
 
Регистрация: 04.01.2013
Сообщений: 1
По умолчанию Решение

Немного подправил.

Если не сложно, выложи решение N334.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;


public class Main implements Runnable {

StreamTokenizer in;
PrintWriter out;

HashMap<Character, Long> m;

static void add(HashMap<Character, Long> m, char c, long d) {
Long i = m.get(c);
if (i == null)
i = new Long(0);
m.put(c, i + d);
}

public void run() {
solve();
}

void solve() {
tryblock:
try {
in = new StreamTokenizer(new BufferedReader(new FileReader((new File("input.txt")))));
out = new PrintWriter(new File("output.txt"));
in.nextToken(); int n = (int) in.nval;
if (n == 1) {
out.println(0);
out.println(1);
out.close();
break tryblock;
}

char[] a = new char[n];

for (int i = 0; i < n; i++) {
in.nextToken(); a[i] = in.sval.charAt(0);
}

int nmax = 0;
long max = 0;

m = new HashMap<Character, Long>();

add(m, a[0], 1);
add(m, a[1], -1);

int i = 2;
int j = n - 1;
HashMap<Character, Long> s = new HashMap<Character, Long>();
add(s, a[1], 1);
while (i <= j) {
add(s, a[j], i - 1);
if (i == j)
break;
add(m, a[j], 1);
add(s, a[i], i);
add(m, a[i], -1);
i++;
j--;
}

for (i = 0; i < n; i++) {
long r = 0;
for (Map.Entry<Character, Long> e : s.entrySet())
r += Math.abs(e.getKey() - a[i]) * e.getValue();
if (max < r) {
max = r;
nmax = i;
}
for (Map.Entry<Character, Long> e : m.entrySet())
add(s, e.getKey(), e.getValue());
add(m, a[(i + 1) % n], 2);
add(m, a[(i + 1 + n / 2) % n], -1);
add(m, a[(i + 1 + (n + 1) / 2) % n], -1);
}
out.println(max);
out.println(nmax + 1);

out.close();
}
catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws IOException {
new Thread(new Main()).start();
}
}
programmer2013 вне форума Ответить с цитированием
Старый 04.01.2013, 18:21   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

334-я
Код:
#include <stdio.h>
#include <stdlib.h>

enum
{
    SINM = 60,
    MINH = 60,
    HINHD = 12,
    SINH = MINH * SINM,
    SINHD = HINHD * SINH
};

int
compare(const void *a, const void *b)
{
  return (*(int *)a - *(int *)b);
}

int
main(void)
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int n;
    scanf("%d", &n);
    int *a = (int *) calloc(n, sizeof(a[0]));
    int i, j;
    unsigned sum = 0;
    for (i = 0; i < n; ++i) {
        int h, m, s;
        scanf("%d:%d:%d", &h, &m ,&s);
        a[i] = SINH * h + SINM * m + s;
        sum += a[i];
    }
    qsort(a, n, sizeof(a[0]), compare);
    unsigned min = SINHD * n + 1, tmp;
    int k;
    i = 0;
    while (i < n) {
        while (i < n - 1 && a[i] == a[i + 1]) {
            ++i;
        }
        tmp = (n - i - 1) * SINHD + n * a[i] - sum;
        if (tmp < min) {
            min = tmp;
            k = i;
        }
        ++i;
    }
    printf("%01d:%02d:%02d\n", a[k]/SINH, a[k]%SINH/SINM, a[k]%SINM);
    free(a);
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Школьная алгебра (Время: 1 сек. Память: 16 Мб Сложность: 27%) kostan3 Помощь студентам 1 06.10.2012 18:32
Вспомнить телешоу - помoгите Сtrl Свободное общение 2 17.07.2011 05:31
Сложность и время работы сортировки Шелла lega4 Помощь студентам 0 11.04.2011 11:02
Как округлить милисекунды в кол-во сек и мили сек? XerSon Общие вопросы Delphi 2 09.06.2010 10:26