ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1403. Курьер

WA#9
Послано KALO 3 окт 2009 14:33
import java.io.*;

class Courier{
    static PrintWriter p=new PrintWriter(System.out);
    static int f;
    static final int k=-'0';
    int mat[][],dp[],max;
    short N,a[],l[],sa,sl;
    boolean ok;

    static int nextInt() throws IOException{
        int t=0;
        for (f=System.in.read(); f<'0' || f>'9'; f=System.in.read());
        for (;f>='0' && f<='9'; t*=10,t+=f+k,f=System.in.read());
        return t;
    }

    Courier() throws IOException{
        N=(short)nextInt();
        mat=new int[N+1][3];
        short i=1;
        for (;i<=N; mat[i][0]=nextInt(),mat[i][1]=nextInt(),mat[i][2]=i++);
        a=new short[N];
        l=new short[N];
        dp=new int[N+1];
        qsort((short) 1,N);
        for (i=1;i<=N; i++){
            if (mat[i][0]>=1){
                a[sa++]=(short) mat[i][2];
                nadji(2,i,mat[i][1]);
                sa--;
            }
        }
        for (p.println(sl),i=0; i<sl; p.print(l[i++]),p.print(' '));
        p.flush();
    }

    void nadji(int k,short p, int s){
        if (k==N+1){
            if (s>max) for (sl=0,max=s; sl<sa; l[sl]=a[sl++]);
            ok=N==sl;
            return;
        }
        if (s<dp[k]) return;
        dp[k]=s;
        short i=(short) (p+1);
        for (;i<=N; i++){
            if (mat[i][0]>=k){
                a[sa++]=(short) mat[i][2];
                nadji(k+1,i,s+mat[i][1]);
                sa--;
                if (ok) return;
            }
        }
        if (s>max) for (max=s,sl=0; sl<sa; l[sl]=a[sl++]);
    }

    void qsort(short a, short b){
        short i=a,j=b,m=(short) ((i+j)>>1);
        int[] t;
        for (;i<j;){
            for (;mat[i][0]<mat[m][0] || (mat[i][0]==mat[m][0] && mat[i][1]<mat[m][1]); i++);
            for (;mat[m][0]<mat[j][0] || (mat[m][0]==mat[j][0] && mat[m][1]<mat[j][1]); j--);
            if (i<=j){
                if (i<j){
                    t=mat[i];
                    mat[i]=mat[j];
                    mat[j]=t;
                }
                i++;
                j--;
            }
        }
        if (i<b) qsort(i,b);
        if (a<j) qsort(a,j);
    }

}

public class Timus1403 {
    public static void main(String[] args) throws IOException{
        new Courier();
    }
}