Hướng dẫn giải của Lập lịch sửa chữa ô tô


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

const maxn=10001;
var n:longint;
    re:qword;
    a,b,c:array[1..maxn] of longint;

procedure rf;
var i:longint;
begin
     readln(n);
     for i:=1 to n do read(a[i]);
     for i:=1 to n do read(b[i]);
     for i:=1 to n do c[i]:=i;
end;

procedure sort(l,r:longint);
var i,x,j,y,u:longint;
begin
     i:=l; j:=r; x:=a[(i+j) shr 1]; y:=b[(i+j) shr 1];
     repeat
           while a[i]*y>b[i]*x do i:=i+1;
           while a[j]*y<b[j]*x do j:=j-1;
           if i<=j then
           begin
                u:=a[i]; a[i]:=a[j]; a[j]:=u;
                u:=b[i]; b[i]:=b[j]; b[j]:=u;
                u:=c[i]; c[i]:=c[j]; c[j]:=u;
                i:=i+1; j:=j-1;
           end;
     until i>j;
     if i<r then sort(i,r);
     if l<j then sort(l,j);
end;

procedure pr;
var i,t:longint; u:qword;
begin
     sort(1,n);
     re:=0; t:=0;
     for i:=1 to n do
     begin
          t:=t+b[i];
          u:=a[i]; u:=u*t;
          re:=re+u;
     end;
end;

procedure wf;
var i:longint;
begin
     writeln(re);
     for i:=1 to n do write(c[i],' ');
end;

begin
     rf;
     pr;
     wf;
end.

Code mẫu của happyboy99x

#include <cstdio>
#include <algorithm>
using namespace std;

#define MAX 10000+5

typedef struct {
    int a, b, i; float x; 
} car;

bool cmp( const car & a, const car & b ) {
    return a.x < b.x;
}

car v[MAX];
int n;

int main() {
    int n; scanf( "%d", &n );
    for( int i = 0; i < n; ++i ) scanf( "%d", &v[i].a );
    for( int i = 0; i < n; ++i ) {
        scanf( "%d", &v[i].b );
        v[i].x = (float) v[i].a / v[i].b;
        v[i].i = i+1;
    }
    sort(v, v+n, cmp);
    long long money = 0, d = 0;
    for( int i = n-1; i >= 0; --i ) {
        d += v[i].b;
        money += d * v[i].a;
    }
    printf( "%lld\n", money );
    for( int i = n-1; i >= 0; --i ) printf( "%d ", v[i].i );
    putchar('\n');
    return 0;
}

Code mẫu của RR

import java.io.*;
import java.util.*;

class Car {
    int a, b, index;
    double c;
    Car() {
    }
}

class CarComparator implements Comparator<Car> {
    public static final double EPS = 1e-9;
    public int compare(Car X, Car Y) {
        if (Math.abs(X.c - Y.c) < EPS) return 0;
        else if (X.c < Y.c) return -1;
        else return 1;
    }
}

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner( System.in );
        PrintWriter pw = new PrintWriter( System.out );
        int n = sc.nextInt();
        Car[] a = new Car[n];

        for(int i = 0; i < n; i++)
            a[i] = new Car();

        for(int i = 0; i < n; i++) a[i].a = sc.nextInt();
        for(int i = 0; i < n; i++) a[i].b = sc.nextInt();
        for(int i = 0; i < n; i++) a[i].index = i+1;
        for(int i = 0; i < n; i++) a[i].c = (double)a[i].b / a[i].a;

        Comparator<Car> cc = new CarComparator();
        Arrays.sort(a, cc);

        long res = 0, time = 0;
        for(int i = 0; i < n; i++) {
            time += a[i].b;
            res += time * a[i].a;
        }
        pw.println(res);

        for(int i = 0; i < n; i++)
            pw.print( a[i].index + " ");

        pw.close();
    }
}

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>

void Quick_Sort(double A[],int d[], int lower,int upper)
{
        double x = A[(lower + upper) / 2];
        int i = lower;
        int j = upper;
        do{
                while(A[i] < x)
                        i ++;
                while (A[j] > x)
                        j --;
                if (i <= j)
                {
                     double tg=A[i];
                     A[i]=A[j];
                     A[j]=tg;
                     int tgd=d[i];
                     d[i]=d[j];
                     d[j]=tgd;   
                        i ++;
                        j --;
                }
        }while(i <= j);
        if (j > lower)
                Quick_Sort(A,d, lower, j);
        if (i < upper)
                Quick_Sort(A,d, i, upper);
}

int main()
{
  // freopen("SCHEDULE.in0","r",stdin);
    int n,a[10001],b[10001],so[10001];
    double c[10001];
    scanf("%d",&n);
    for(int i = 1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        so[i] = i;        
    }
    for(int i = 1;i<=n;i++)
    {
        scanf("%d",&b[i]);
        c[i] = b[i]*1./a[i];      
    }
    Quick_Sort(c,so,1,n);
    long long KQ = 0, t = 0;
    for(int i = 1;i<=n;i++)
    {
        t = t+b[so[i]];
        KQ = KQ+t*a[so[i]];
    }
    printf("%lld\n",KQ);
    for(int i = 1;i<=n;i++) printf("%d ",so[i]);
    //getch();
}

Code mẫu của ll931110

{$MODE DELPHI}
const
  InputFile  = '';
  OutputFile = '';
  max = 10000;
var
  a, b, Index: array[1..max] of Integer;
  n: Integer;
  Res: Comp;

procedure Enter;
var
  f: Text;
  i: Integer;
begin
  Assign(f, InputFile); Reset(f);
  Readln(f, n);
  for i := 1 to n do Read(f, a[i]);
  Readln(f);
  for i := 1 to n do Read(f, b[i]);
  Close(f);
end;

procedure Init;
var
  i: Integer;
begin
  for i := 1 to n do Index[i] := i;
end;

function Lower(i, j: Integer): Boolean; {= a[i]/b[i] > a[j]/b[j]}
begin
  Lower := LongInt(a[i]) * b[j] > LongInt(a[j]) * b[i];
end;

procedure QSort(L, H: Integer);
var
  k, i, j, t: Integer;
begin
  if L >= H then Exit;
  k := Index[Random(H - L + 1) + L];
  i := L; j := H;
  repeat
    while Lower(Index[i], k) do Inc(i);
    while Lower(k, Index[j]) do Dec(j);
    if i <= j then
      begin
        t := Index[i]; Index[i] := Index[j]; Index[j] := t;
        Inc(i); Dec(j);
      end;
  until i > j;
  QSort(L, j); QSort(i, H);
end;

procedure Solve;
var
  t: LongInt;
  i, j: Integer;
begin
  t := 0; Res := 0;
  for i := 1 to n do
    begin
      j := Index[i];
      t := t + b[j];
      Res := Res + a[j] * (t + 0.0);
    end;
end;

procedure Result;
var
  f: Text;
  i: Integer;
begin
  Assign(f, OutputFile); Rewrite(f);
  Writeln(f, Res:0:0);
  for i := 1 to n do  Write(f, Index[i], ' ');
  Close(f);
end;

begin
  Enter;
  Init;
  QSort(1, n);
  Solve;
  Result;
end.
2
1 1
1 2

Code mẫu của khuc_tuan

import java.io.*;
import java.util.*;
import static java.lang.Integer.parseInt;
public class Main{
    static class Element implements Comparable<Element>{
        public int a,b,i;
        public int compareTo(Element x) {
            return -a*x.b+b*x.a;
        }
    }
    public static void main(String[]Args) throws Exception {
        BufferedReader kb=new BufferedReader(new InputStreamReader(System.in));
        int n=parseInt(kb.readLine());
        Element[] a=new Element[n];
        for(int i=0;i<n;++i) a[i]=new Element();
        StringTokenizer st=new StringTokenizer(kb.readLine());
        for(int i=0;i<n;++i) {
            a[i].a = parseInt(st.nextToken());
            a[i].i = i+1;
        }
        st=new StringTokenizer(kb.readLine());
        for(int i=0;i<n;++i) a[i].b=parseInt(st.nextToken());
        Arrays.sort(a);
        long s=0,r=0;
        for(Element x:a) {
            s+=x.b;
            r+=s*x.a;
        }
        System.out.println(r);
        for(Element x:a) System.out.print(x.i+" ");
    }
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.