На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
Здесь предлагаю обсуждать решения
Поза форумом
//ferry.cpp #include <iostream>; #include <algorithm>; using namespace std; int main() { int a[10001]; int n,i,j; long ans; cin>>n; i=0; ans=0; cin>>a[0]; while (++i<n) cin>>a[i]; sort(a,a+n); i=n-1; while (i>2) { if (2*a[1]>a[0]+a[i-1]) ans+=2*a[0]+a[i]+a[i-1]; else ans+=a[0]+2*a[1]+a[i]; i-=2; } if (i==2) ans+=a[2]+a[1]+a[0]; if (i==1) ans+=a[1]; cout<<ans<<endl; } .
идея такова - либо возит людей первый либо он с вторым, корректность решения доказана математически строго.
Поза форумом
//mayor.cpp #include <iostream>; #include <cmath>; using namespace std; #define BASE 10000 // Основание #define MAX_DIG 9999 // Максимальная цифра #define BASE_DIG 4 // Количество десятичных цифр в разряде(для печати) class BigInt { public: long long Size, SizeMax; short *Coef; BigInt(); BigInt(long long); BigInt(const BigInt&); virtual ~BigInt(); void zero(); BigInt& operator=(const BigInt&); operator long(); }; void Add(const BigInt&, const BigInt&, BigInt&); int Sub(const BigInt&, const BigInt&, BigInt&); void Div(const BigInt&, BigInt&, BigInt&, BigInt&); void SMul(const BigInt&, const short B, BigInt&); void Mul(const BigInt&, const BigInt&, BigInt&); void SDiv(const BigInt &A, const short B, BigInt &Q, short &R); void Div(const BigInt &A, const BigInt &V, BigInt &Q, BigInt &R); ostream& operator<<(ostream& os, const BigInt& A); clock_t time_global; void error(char *error_text) { std::cout << "Run-time error...\n" << error_text << "\n"; exit(0); } template<class T> inline void swap(T& a, T& b) { T temp = a; b = a; a = temp; } void start() { time_global = clock(); } clock_t finish() { return (clock() - time_global); } BigInt::BigInt() { SizeMax = Size = 0; Coef = NULL; } BigInt::BigInt(long long MaxLen) { Coef = new short[MaxLen]; SizeMax = MaxLen; } BigInt::BigInt(const BigInt &A) { SizeMax = A.SizeMax; Size = A.Size; Coef = new short[SizeMax]; for(long long i=0; i<SizeMax; i++) Coef[i] = A.Coef[i]; } BigInt::~BigInt() { delete Coef; } void BigInt::zero() { Coef= new short[1000]; SizeMax=1000; for(long long i=0; i<SizeMax; i++) Coef[i]=0; Size=1; } BigInt::operator long() { long tmp=0; // warning: overflow possible ! for(short i=0; i<Size; i++) tmp += Coef[i]*(long)pow( BASE, (double)i); return tmp; } inline BigInt& BigInt::operator=(const BigInt &A) { const short *a = A.Coef; if (this == &A) return *this; if ( SizeMax < A.Size ) { delete Coef; Coef = new short[A.Size]; SizeMax = Size = A.Size; } else Size = A.Size; for(long long l=0; l<Size; l++) Coef[l] = a[l]; return *this; } void Add(const BigInt &A, const BigInt &B, BigInt &C) { long long i; long temp; const short *a=A.Coef, *b=B.Coef; short *c=C.Coef, carry = 0; if ( A.Size < B.Size ) { Add(B,A,C); return; } for (i=0; i<B.Size; i++) { temp = a[i] + b[i] + carry; if (temp >= BASE) { c[i] = temp - BASE; carry = 1; } else { c[i] = temp; carry = 0; } } for (; i < A.Size; i++) { temp = a[i] + carry; if (temp >= BASE) { c[i] = temp - BASE; carry = 1; } else { c[i] = temp; carry = 0; } } if (carry) { c[i] = carry; C.Size = A.Size+1; } else C.Size = A.Size; } void SMul(const BigInt &A, const short B, BigInt &C) { long i, temp; const short *a=A.Coef; short *c=C.Coef, carry=0; for (i=0; i<A.Size;i++) { temp = a[i]*B + carry; carry = temp / BASE; c[i] = temp - carry*BASE; } if (carry) { c[i] = carry; C.Size = A.Size+1; } else C.Size = A.Size; } ostream& operator<<(ostream& os, const BigInt& A) { long j, Digit=0; short Pow, Dec, Coef; os << A.Coef[A.Size-1]; for (long i=A.Size-2; i>=0; i--) { Pow = BASE/10; Coef = A.Coef[i]; for (j=0; j<BASE_DIG; j++) { Dec = Coef/Pow; Coef -= Dec*Pow; Pow /= 10; os << Dec; Digit++; /*if (Digit%1000==0) os << "\n\n"; else if (Digit%50==0) os << "\t: " << Digit << "\n";*/ } } return os; } ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// int main() { BigInt a[2][9]; int i,j,k,n; cin >> n; i=0; a[0][2].zero(); a[0][1].zero(); a[0][1].Coef[0]=1; a[0][3].zero(); a[0][4].zero(); a[0][5].zero(); a[0][6].zero(); a[0][7].zero(); a[0][8].zero(); a[1][2].zero(); a[1][1].zero(); a[1][3].zero(); a[1][4].zero(); a[1][5].zero(); a[1][6].zero(); a[1][7].zero(); a[1][8].zero(); while (++i<=n) { j=i%2; k=(j+1)%2; SMul(a[k][1],3,a[j][1]); Add(a[j][1],a[k][2],a[j][1]); Add(a[j][1],a[k][2],a[j][1]); Add(a[j][1],a[k][3],a[j][1]); Add(a[j][1],a[k][4],a[j][1]);//a[j][1]=a[k][1]*3+a[k][2]*2+a[k][3]+a[k][4]*2+a[k][5]+a[k][7]+a[k][6]+a[k][8]; Add(a[j][1],a[k][4],a[j][1]); Add(a[j][1],a[k][5],a[j][1]); Add(a[j][1],a[k][6],a[j][1]); Add(a[j][1],a[k][7],a[j][1]); Add(a[j][1],a[k][8],a[j][1]); SMul(a[k][1],2,a[j][2]); Add(a[j][2],a[k][3],a[j][2]); Add(a[j][2],a[k][4],a[j][2]);//a[j][2]=a[k][1]*2+a[k][3]+a[k][4]+a[k][7]; Add(a[j][2],a[k][7],a[j][2]); a[j][3]=a[k][1]; Add(a[j][3],a[k][2],a[j][3]); Add(a[j][3],a[k][4],a[j][3]);//a[j][3]=a[k][1]+a[k][2]+a[k][4]+a[k][6]; Add(a[j][3],a[k][6],a[j][3]); SMul(a[k][1],2,a[j][4]); Add(a[j][4],a[k][2],a[j][4]); Add(a[j][4],a[k][3],a[j][4]);//a[j][4]=a[k][1]*2+a[k][2]+a[k][3]+a[k][5]; Add(a[j][4],a[k][5],a[j][4]); a[j][5]=a[k][1]; Add(a[j][5],a[k][4],a[j][5]);//a[j][5]=a[k][1]+a[k][4]; a[j][6]=a[k][1];//a[j][6]=a[k][1]+a[k][3]; Add(a[j][6],a[k][3],a[j][6]); a[j][7]=a[k][1]; Add(a[j][7],a[k][2],a[j][7]);//a[j][7]=a[k][1]+a[k][2]; a[j][8]=a[k][1]; /* a[j][8]=a[k][1];*/ } cout<<a[j][1]<<endl; }
Мой метод майора - динамика по краю+длинная арифметика.
Поза форумом
Привет Дима
Off top
Если на e-mail получил 5 "Принято" а в результатах токо 4
сколько задач будут оценивать
Поза форумом
//mayor2.cpp #include <iostream>; #define PPP 2; #defiine QQQ 1; using namespace std; int main() { int n,p,i,j,k,prd,py; char a[1001][1001]; cin>>n>>p; for (i=0;i<=1000;i++) for (j=0;j<=1000;j++) a[i,j]=0; for(i=1;i<=p;i++) { cin>>j>>k; a[j][k]=QQQ; } prd=0; k=0; j=2; while (p) { prd++; i=prd; j=1; k++; while (i<=n) { py=j; while ((j<=n)&&(a[j][i]!=PPP)) { if (a[j][i]==QQQ) { py=j; p--; } a[j][i]=PPP; j++; } i++; j=py; } } cout<<k<<endl; }
идия майора2 - строим огибающюю далее для осавшыхся точек тоже - количество огибающих - ответ
Поза форумом
Vladimir написав:
Привет Дима
Off top
Если на e-mail получил 5 "Принято" а в результатах токо 4
сколько задач будут оценивать
4 к сожелению... читай другие посты, у когото в прошлом туре так было - поледнее письмо дошло позже 24
Поза форумом
идей зигзага в транзитивности бинарных отношений небольше и неменьше отсюда решение.
#include <iostream>; using namespace std; short sr(long double a, long double b) { if (a>b) return 3; if (a<b) return 1; return 2;} int main() { long double a[4]; int i,n,ans; short g,k; bool q; cin>>n; i=1; ans=0; k=0; cin>>a[0]>>a[1]; g=sr(a[0],a[1]); q=(a[0]==a[1]); while (++i<n) { cin>>a[(i)%3]; k=g; g=sr(a[(i+2)%3],a[(i)%3]); q=q&&(a[(i+2)%3]==a[(i)%3]); if (((k>1)&&(g>1))||((k<3)&&(g<3))) ans++; } if (q) ans++; cout<<ans<<endl; }
Поза форумом
а ньюареа идея такова - строим масив смежности(кто с кам пересикается) и ищем количество связных облостей и выписываем размер наибольшей
Поза форумом
FERRY
Ідея проста: найшвидший перевозить всіх остальних.
//#define MY_DEBUG 10
//-------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#ifdef MY_DEBUG
#include <conio>
#include <fstream>
#pragma hdrstop
#include <system.hpp>
#pragma argsused
#endif
using namespace std;
#pragma comment(linker, "/STACK:16777216")
//global variable;
#define PI 3.1415926535897932384626433832795
#ifdef MY_DEBUG
ifstream in("in.txt",ios::in | ios::binary);
ofstream out("out.txt",ios::out | ios::binary);
#endif
//function
//class
class Task
{
//global variable
int N;
int people[20000];
int res;
public:
Task()
{
}
~Task()
{
}
//this is my code
void ReadData()
{
#ifdef MY_DEBUG
//here reading in file
in >> N;
for(int i = 0;i < N;++i)
in >> people[i];
#endif
#ifndef MY_DEBUG
//here standart reading
cin >> N;
for(int i = 0;i < N;++i)
cin >> people[i];
#endif
}
void OutData()
{
#ifdef MY_DEBUG
//here writing in file
cout << res;
#endif
#ifndef MY_DEBUG
//here writing in consol
cout << res;
#endif
}
void Solve()
{
//here solving problem
int min;
res = 0;
sort(people,people + N);
min = people[0];
for(int i = 1;i < N - 1;++i)
{
res += min + people[i];
}
res += people[N - 1];
}
};
int main(int argc, char* argv[])
{
Task a;
#ifdef MY_DEBUG
TDateTime time,time2;
time = time.CurrentDateTime();
#endif
a.ReadData();
a.Solve();
a.OutData();
#ifdef MY_DEBUG
time2 = time2.CurrentDateTime() - time;
unsigned short msec,sec,h,m;
time2.DecodeTime(&h,&m,&sec,&msec);
cout<<endl<<"Solve Time: "<<sec<<":"<<msec<<endl;
in.close();
out.close();
getch();
#endif
return 0;
}
//---------------------------------------------------------------------------
Відредаговано Yevgeniy (2006-12-01 06:20:40)
Поза форумом
Yevgeniy написав:
FERRY
Ідея проста: найшвидший перевозить всіх остальних.
//#define MY_DEBUG 10
//-------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#ifdef MY_DEBUG
#include <conio>
#include <fstream>
#pragma hdrstop
#include <system.hpp>
#pragma argsused
#endif
using namespace std;
#pragma comment(linker, "/STACK:16777216")
//global variable;
#define PI 3.1415926535897932384626433832795
#ifdef MY_DEBUG
ifstream in("in.txt",ios::in | ios::binary);
ofstream out("out.txt",ios::out | ios::binary);
#endif
//function
//class
class Task
{
//global variable
int N;
int people[20000];
int res;
public:
Task()
{
}
~Task()
{
}
//this is my code
void ReadData()
{
#ifdef MY_DEBUG
//here reading in file
in >> N;
for(int i = 0;i < N;++i)
in >> people[i];
#endif
#ifndef MY_DEBUG
//here standart reading
cin >> N;
for(int i = 0;i < N;++i)
cin >> people[i];
#endif
}
void OutData()
{
#ifdef MY_DEBUG
//here writing in file
cout << res;
#endif
#ifndef MY_DEBUG
//here writing in consol
cout << res;
#endif
}
void Solve()
{
//here solving problem
int min;
res = 0;
sort(people,people + N);
min = people[0];
for(int i = 1;i < N - 1;++i)
{
res += min + people[i];
}
res += people[N - 1];
}
};
int main(int argc, char* argv[])
{
Task a;
#ifdef MY_DEBUG
TDateTime time,time2;
time = time.CurrentDateTime();
#endif
a.ReadData();
a.Solve();
a.OutData();
#ifdef MY_DEBUG
time2 = time2.CurrentDateTime() - time;
unsigned short msec,sec,h,m;
time2.DecodeTime(&h,&m,&sec,&msec);
cout<<endl<<"Solve Time: "<<sec<<":"<<msec<<endl;
in.close();
out.close();
getch();
#endif
return 0;
}
//---------------------------------------------------------------------------
Твоё решение "пролетает" на тесте 4 1 1 8 8 твое решение выдаст 19 а надо 12(4 - количество человек)(если правильно понял идею)
Поза форумом
Ferry
Есть 2 тривиальных метода:
1. самый быстрый перевозит всех (идея Yevgeniy)
2. тормоза переправляются парами и двое самых быстрых гоняют лодку.
эти методы и надо скомбинировать. Точка перехода -- условие от Dark_Dimius (2*a[1]>a[0]+a[i-1])
доказывается строго
У реализовавших один из методов пройдет, имхо, 1 тест
если реализовать оба и выбирать лучший -- 2.
#include <stdio.h> #define maxN 10000 int N, i, tt[maxN]; long T, t_crit, t_const; int qsort(int l, int r) { int i, j, m, t; i=l, j=r, m=tt[(l+r)/2]; do{ for (; tt[i]<m; i++); for (; tt[j]>m; j--); if (i<=j) { t=tt[i]; tt[i]=tt[j]; tt[j]=t; i++; j--; }; }while (i<=j); if (i<r) qsort(i,r); if (l<j) qsort(l,j); return 0; }; int main() { scanf("%d",&N); for (i=0; i<N; i++) scanf(" %d",&(tt[i])); qsort(0,N-1); T=0; t_crit=2*tt[1]-tt[0]; t_const=2*tt[1]+tt[0]; for (i=N-1; tt[i-1]>t_crit; i-=2) T+=t_const+tt[i]; for (; i>1; i--) T+=tt[0]+tt[i]; T+=tt[1]; printf("%ld",T); return 0; };
Відредаговано Pavel (2006-12-01 08:58:51)
Поза форумом
mayor
динамика + длинная арифметика. У меня 12 состояний и ручками прорисованы зависимости.
сложность задачи в невозможности проверить-прорисовать варианты даже для 3 (у меня 131)
тут либо zero либо full.
#include <stdio.h> #define maxN 1000 #define maxCond 12 #define maxLayer 2 #define maxRef 11 #define maxL 1000 //000 //100, 010, 110, 101 //200, 020 //210, 201, 120 //220, 202 int CondCRef[maxCond][2]={ {11,11},{2,0},{2,0},{4,3},{4,4},{2,0}, {2,0},{2,0},{2,0},{2,0},{4,3},{4,4}}; int CondRef_p[maxCond][maxRef][2]={ {{3,0},{3,0},{4,0},{0,1},{1,1},{1,1},{2,1},{4,1},{10,1},{10,1},{11,1}}, {{0,0},{3,1}}, {{0,0},{4,1}}, {{1,0},{2,0},{8,1},{9,1}}, {{1,0},{1,0},{7,1},{7,1}}, {{0,0},{1,0}}, {{0,0},{2,0}}, {{2,0},{3,0}}, {{1,0},{4,0}}, {{1,0},{3,0}}, {{5,0},{6,0},{7,0},{9,0}}, {{5,0},{5,0},{8,0},{8,0}}}; int CondRef_m[maxCond][maxRef][2]={ {{0,0},{2,0},{5,1},{5,1},{6,1},{7,1},{7,1},{8,1},{8,1},{9,1},{9,1}}, {}, {}, {{1,1},{3,1},{4,1}}, {{0,0},{2,1},{3,1},{3,1}}, {}, {}, {}, {}, {}, {{0,0},{1,0},{2,0}}, {{0,0},{1,0},{1,0},{4,0}}}; int CondL[maxCond][maxLayer]; int Cond[maxCond][maxLayer][maxL]; int out(int c, int l) { for (int i=CondL[c][l]-1; i>=0; i--) printf("%d",Cond[c][l][i]); return 0; }; int clearCV(int *c) { for (int i=0; i<maxL; i++) c[i]=0; return 0; }; int plusCV(int *c, int &cl, int *a, int al) { int over=0, i; for (i=0; i<al; i++) { over=c[i]+a[i]+over; c[i]=over%10; over/=10; }; while (over>0) { over=c[i]+over; c[i]=over%10; over/=10; i++; }; cl=(i<cl)?cl:i; return 0; }; int minusCV(int *c, int &cl, int *a, int al) { int over=0, i; for (i=0; i<al; i++) { over=c[i]-a[i]+over; c[i]=(10+over)%10; over=(10+over)/10-1; }; while (over<0) { over=c[i]+over; c[i]=(10+over)%10; over=(10+over)/10-1; i++; }; for (cl=(i<cl)?cl:i; c[cl-1]==0; cl--); return 0; }; int copyCV(int *s, int sl, int *d) { for (int i=0; i<sl; i++) d[i]=s[i]; return 0; }; int main() { int i,j,N; int plus, minus, Ci, Cl; int curC[maxL], curCl; for (int i=0; i<maxCond; i++) for (j=0; j<maxLayer; j++) { CondL[i][j]=1; Cond[i][j][0]=0; }; Cond[0][0][0]=1; scanf("%d",&N); for (;N>0; N--) { for (j=1; j<maxCond; j++) { curCl=0; clearCV(curC); plus=CondCRef[j][0]; for (i=0; i<plus; i++) { Ci=CondRef_p[j][i][0]; Cl=CondRef_p[j][i][1]; plusCV(curC, curCl, Cond[Ci][Cl], CondL[Ci][Cl]); }; minus=CondCRef[j][1]; for (i=0; i<minus; i++) { Ci=CondRef_m[j][i][0]; Cl=CondRef_m[j][i][1]; minusCV(curC, curCl, Cond[Ci][Cl], CondL[Ci][Cl]); }; copyCV(curC, curCl, Cond[j][0]); CondL[j][0]=curCl; }; curCl=0; clearCV(curC); plus=CondCRef[0][0]; for (i=0; i<plus; i++) { Ci=CondRef_p[0][i][0]; Cl=CondRef_p[0][i][1]; plusCV(curC, curCl, Cond[Ci][Cl], CondL[Ci][Cl]); }; minus=CondCRef[0][1]; for (i=0; i<minus; i++) { Ci=CondRef_m[0][i][0]; Cl=CondRef_m[0][i][1]; minusCV(curC, curCl, Cond[Ci][Cl], CondL[Ci][Cl]); }; for (i=0; i<maxCond; i++) for (j=maxLayer-1; j>0; j--) { copyCV(Cond[i][j-1], CondL[i][j-1], Cond[i][j]); CondL[i][j]=CondL[i][j-1]; }; copyCV(curC, curCl, Cond[0][0]); CondL[0][0]=curCl; }; out(0,0); return 0; };
Поза форумом
mayor2
ступенчатые огибающие. изысков 0.
#include <stdio.h> #define maxN 1000 #define maxP 1000000 int N, x, y, ct, res; long i, j, P, ST; char CR[maxN+1][maxN]; int Top[maxN]; int main() { scanf("%d %ld",&N,&P); for (i=0; i<N; i++) { Top[i]=0; //topest CR[0][i]=1; for (j=1; j<=N; j++) CR[j][i]=0; }; for (i=0; i<P; i++) { scanf("%d %d",&x,&y); y--; CR[x][y]=1; if (x>Top[y]) Top[y]=x; }; res=0; ST=0; for (i=0; i<N; ST+=Top[i++]); while (ST) { ct=0; for (i=0; i<N; i++) { if (ct<Top[i]) { for (j=ct-1; (j>0) && (CR[i][j]==0); j--); ct=Top[i]; Top[i]=(j>0)?j:0; }; }; res++; ST=0; for (i=0; i<N; ST+=Top[i++]); }; printf("%d",res); return 0; };
zigzag
главное аккуратность
#include <stdio.h> #define MaxN 10000 #define MaxX 1000 int N, mode, s, k, x, y, i; int sign(int x, int y) { if (x<y) return 1; if (x>y) return -1; return 0; }; int main() { scanf("%d %d %d",&N,&x,&y); mode=sign(x,y); k=N-2; for (i=2; i<N; i++) { scanf("%d",&x); s=sign(y,x); y=x; if (s*mode==-1) k--; if (s!=0) mode=s; }; if (mode==0) k++; printf("%d",k); return 0; };
Поза форумом
Коли у нас є два берега, то якби ми не переправляли туристів злівого берега на правий бурег, то за раз ми можемо максимально переправити 1 туриста, бо з правого берега потрібно повернути лодку до лівого (місць тільки 2), при цьому витративши менше часу, і тільки коли на лівому березі знаходиться один турист, то можемо переправити двох одночасно. Звідки слідує єдине рішеня -- найшвидший перевозить всіх остальних.
Поза форумом
var n,i,j,t,res:integer;
a,b:array[1..10000]of integer;
tep:boolean;
begin
read(n);
read(a[1]);
b[1]:=0;
for i:=2 to n do
begin
read(a[i]);
if a[i] > a[i-1] then b[i]:=b[i-1]+1;
if a[i] < a[i-1] then b[i]:=b[i-1]-1;
if a[i] = a[i-1] then b[i]:=b[i-1];
end;
tep:=true;
if a[1] > a[2] then t:=-1;
if a[1] < a[2] then t:=1;
if a[1] = a[2] then
begin
i:=1;
while (a[i] = a[i+1])and(i < n) do inc(i);
if (i < n) then
begin
if a[1] > a[i+1] then t:=-1;
if a[1] < a[i+1] then t:=1;
end else
begin
res:=n-1;
tep:=false;
end;
end;
if tep = true then
begin
for i:=1 to n-1 do a[i]:=b[i+1]-b[i];
res:=0;
for i:=1 to n-1 do
begin
if a[i] <> t then
begin
j:=i;
while (a[j] <> t) and (j <= n-1) do
begin
inc(j);
inc(res);
end;
i:=j;
end;
if t = 1 then t:= -1 else t:=1;
if i > n-1 then break;
end;
end;
writeln(res);
end.
Зигзаг - идея в том:
Пример: 5 1 100 -100 220 40
представим числа в виде : 1 2 1 2 1 (1 100 -100 220 40 : от 1 до 100 возрастает от 100 до -100 убывает от -100 до 220 возрастает и от 220 до 40 убывает)
Вычтем из второго первое получим: -1 -1 -1 тоесть послед является зигзагом
Поза форумом
Хто найде тест при якому програма збоїть (памагите!). Дам рубль.
program ZigZag;
var ch:array [1..10000] of integer;
i,n,ch_pop,ch_isn,spos,k:integer;
procedure zbig (var x,y:integer);
begin
x:=x+1;
if y=1 then y:=2 else y:=1;
end;
begin
k:=0;
read (n,ch[1]);
for i:=2 to n do
begin
read (ch[i]);
if i=2 then if ch[1]>ch[2] then spos:=1 else spos:=2;
case spos of
1:begin
if (((i mod 2)=0) and (ch[i-1]<=ch[i])) then zbig (k,spos);
if (((i mod 2)=1) and (ch[i-1]>=ch[i])) then zbig (k,spos);
end;
2:begin
if (((i mod 2)=0) and (ch[i-1]>=ch[i])) then zbig (k,spos);
if (((i mod 2)=1) and (ch[i-1]<=ch[i])) then zbig (k,spos);
end;
end;
end;
writeln (k);
end.
Поза форумом
А если первый равен второму?
Поза форумом
В мене невідомо чому пролетіла перша задача:-) я там занадно нахімічив з оптимізацією...
а так все решта пройшло по максимумах...
2. Ferry
Розглядається два варіанти, або найлегший тягає всіх, або комбінація 2 найлегші - 2 найважчі.
program Ferry; Type TArray = Array[1..10000] of integer; var A : TArray; N, I, K, S, M1, M2, M3 : longint; F : boolean; Procedure QuickSort(M,T : Integer); var I, J, X, W : Integer; begin I := M; J := T; X := A[(M+T) div 2]; repeat while A[i] < X do Inc(I); while A[J] > X do Dec(J); if I <= J then begin W := A[i]; A[i] := A[J]; A[J] := W; Inc(I); Dec(J); end; until I > J; if M < J then QuickSort(M,J); if I < T then QuickSort(I,T); end; begin read(N); for I := 1 to N do begin read(A[i]); end; QuickSort(1,N); K := N; S := 0; M1 := 2 * A[2] - A[1]; M2 := 2 * A[2] + A[1]; M3 := 2 * A[1]; F := False; repeat if K = 3 then begin S := S + A[1] + A[2] + A[3]; break; end else if K = 2 then begin S := S + A[2]; break; end; if F = True then begin S := S + M3 + A[K] + A[K-1]; K := K - 2; continue; end; if M1 - A[K-1] > 0 then begin S := S + M3 + A[K] + A[K-1]; F := True; end else S := S + M2 + A[K]; K := K -2; until False; write(S); end.
3. Mayor
Тут треба використовувати динамічне програмування... і довго арифметику, але так, що в одному елементі масиву знаходиться кілька цифр(в мене 6)
program Mayor; const Osn = 1000000; Type TLong = Array[0..135] of longint; var An, Bn, Zn, An1, Bn1, Zn1, An2, Bn2, Zn2, T1, T2, T3, T4, tBn, tBn1 : Tlong; N, I : integer; procedure Sum(var A, B, C : TLong); var I, K : Integer; begin FillChar(C, SizeOf(C), 0); if A[0] > B[0] then K := A[0] else K := B[0]; for I := 1 to K do begin C[I+1] := (C[i]+A[i]+B[i]) div Osn; C[i] := (C[i]+A[i]+B[i]) mod Osn; end; if C[K+1] = 0 then C[0] := K else C[0] := K + 1; end; procedure WriteLong(Const A : Tlong); var Ls, S : string; I : integer; begin str(Osn div 10, Ls); write(A[A[0]]); for I := A[0] - 1 downto 1 do begin str(A[i],S); while Length(S) < Length(Ls) do S := '0' + S; write(S); end; end; begin read(N); if N = 2 then begin write(22); halt(0); end; An2[0] := 1; An2[1] := 1; Bn2[0] := 1; Bn2[1] := 1; Zn2[0] := 1; Zn2[1] := 3; An1[0] := 1; An1[1] := 8; Bn1[0] := 1; Bn1[1] := 5; Zn1[0] := 1; Zn1[1] := 22; for I := 3 to N do begin Sum(An2,Zn2,T1); Sum(Bn1,Bn2,T2); Sum(T1,T2,T3); Sum(Zn1,T3,Bn); Sum(T3,T1,T4); Sum(T4,Bn,An); Sum(Bn, Bn, tBn); Sum(Bn1, Bn1, tBn1); Sum(An1, Zn2, T1); Sum(An, tBn, T2); Sum(T1, tBn1, T3); Sum(T2, T3, Zn); An2 := An1; Bn2 := Bn1; Zn2 := Zn1; An1 := An; Bn1 := Bn; Zn1 := Zn; end; WriteLong(Zn); end.
4. Mayor2
Я цю задачу зробив двома способами, перший - динамічні списки, другий - просто прохід по матриці...
Я відіслав другий спосіб, хоча на тестах зараз перший варіант працює навіть швидше...
Одразу кажу, що я память не очищав:-) зайвий час... тому і впринципі трохи забоявся відсилати цей варіант...
Mayor2(спосіб1)
program Mayor2; Type Pt = ^elem; Elem = Record data : integer; next : Pt; previous : Pt; end; PMas = Array[1..1000] of Pt; Mas1 = Array[0..1000] of integer; var PFirstX, PLastX : PMas; Len : Mas1; Z, Q, PFirstY, PLastY, PX, PY : Pt; X, Y, N, Kp, I, KY, MaxX, K, J : integer; F : boolean; procedure InsBegin(var PFirst : pt; var El : integer); var NewFirst : pt; begin New(NewFirst); NewFirst^.next := PFirst; if PFirst <> nil then PFirst^.previous := NewFirst; NewFirst^.data := El; PFirst := NewFirst; PFirst^.previous := nil; end; procedure InsEnd(var PLast : pt; var El : integer); var Q : pt; begin New(PLast^.next); Q := PLast; PLast := PLast^.next; PLast^.data := El; PLast^.next := nil; PLast^.previous := Q; end; procedure InsMed(var PFirst : pt;var El : integer); var Q, NewM : pt; begin New(NewM); Q := PFirst; while El > Q^.next^.data do Q := Q^.next; NewM^.next := Q^.next; Q^.next^.previous := NewM; NewM^.data := El; Q^.next := NewM; NewM^.previous := Q; end; procedure InsEl(var PFirst, PLast : pt; var El : integer); begin if El < PFirst^.data then InsBegin(PFirst,El) else if El > PLast^.data then InsEnd(PLast,El) else InsMed(PFirst,El); end; procedure ReadData; begin read(N); read(Kp); FillChar(Len,SizeOf(Len),0); KY := 0; for I := 1 to Kp do begin read(X,Y); if Len[Y] = 0 then begin PFirstX[Y] := nil; InsBegin(PFirstX[Y],X); PLastX[Y] := PFirstX[Y]; Inc(Len[Y]); if Ky = 0 then begin PFirstY := nil; InsBegin(PFirstY,Y); PLastY := PFirstY; end else begin InsEl(PFirstY, PLastY, Y); end; inc(Ky); continue; end else begin InsEl(PFirstX[Y], PLastx[Y], X); Inc(Len[Y]); end; end; end; procedure DelEl(var Pel : pt); begin if Pel = PFirstY then begin if Pel^.next = nil then begin PFirstY := nil; exit; end; PFirstY := Pel^.next; PFirstY^.previous := nil; end else if Pel = PLastY then begin PLastY := Pel^.previous; PLastY^.next := nil; end else begin Pel^.previous^.next := Pel^.next; Pel^.next^.previous := Pel^.previous; end; end; begin ReadData; K := 0; repeat Py := PFirstY; MaxX := PLastX[PFirstY^.data]^.data; PFirstX[Py^.data] := PLastX[Py^.data]; PLastX[Py^.data]^.previous := nil; while Py <> nil do begin Px := PLastX[Py^.data]; F := False; if Px^.data < MaxX then begin Py := Py^.next; continue; end; while Px <> nil do begin if Px^.data < MaxX then begin F := True; MaxX := PLastX[Py^.data]^.data; PLastX[Py^.data] := Px; PLastX[Py^.data]^.next := nil; break; end; Px := Px^.previous; end; if F = False then begin MaxX := PLastX[Py^.data]^.data; DelEl(Py); dec(Ky); end; Py := Py^.next; end; inc(K); until (Ky = 0); write(K); end.
Mayor2(2 спосіб) я його відіслав...
program Mayor2; Type Mas1 = Array[1..1000,1..1000] of byte; Mas2 = Array[1..1000] of boolean; Mas3 = Array[1..1000] of integer; var A : Mas1; B : Mas2; MaxX, MinX : Mas3; N, P, MaxP, MinY, MaxY, Ky, K, X, Y, H, I, J : integer; begin read(N); read(P); MaxY := 0; MinY := 1000; Ky := 0; K := 0; FillChar(A,SizeOf(A),0); FillChar(B,SizeOf(B),False); FillChar(MaxX,SizeOf(MaxX),0); for I := 1 to N do MinX[i] := 1000; for I := 1 to P do begin read(X,Y); A[X,Y] := 1; if X > MaxX[Y] then MaxX[Y] := X; if X < MinX[Y] then MinX[Y] := X; if Y > MaxY then MaxY := Y; if Y < MinY then MinY := Y; if B[Y] = False then begin B[Y] := True; inc(Ky); end; end; for I := MinY to MaxY do begin if B[i] = False then continue; MaxP := MaxX[i]; B[i] := False; dec(Ky); for Y := I + 1 to MaxY do begin if B[Y] = False then continue; if MaxX[Y] < MaxP then continue; if MinX[Y] >= MaxP then begin B[Y] := False; dec(Ky); MaxP := MaxX[Y]; continue; end; H := MaxP; for X := H-1 downto MinX[Y] do if (A[X,Y] = 1) then begin MaxP := MaxX[Y]; MaxX[Y] := X; break; end; end; inc(K); if Ky = 0 then break; end; write(K); end.
5. ZigZag
задача проста... треба просто розглянути по два варіанти на кожен випадок...
тобто варіанти зміни + -. ну в коді повинно бути зрозуміло...
program Zigzag; Type TNumberArray = Array[1..10000] of integer; var A : TNumberArray; N, Res, MinRes, I : longint; Next : boolean; function Insertions(Next : boolean) : integer; var K : integer; begin K := 0; for I := 3 to N do begin if Next = True then begin if A[i] > A[I-1] then begin Next := not Next; continue end end else if Next = False then if A[i] < A[I-1] then begin Next := not Next; continue end; inc(K); end; Insertions := K; end; begin read(N); for I := 1 to N do read(A[i]); if A[1] > A[2] then begin MinRes := Insertions(True); Res := 1 + Insertions(False); end else if A[1] < A[2] then begin MinRes := Insertions(False); Res := 1 + Insertions(True); end else begin MinRes := 1 + Insertions(False); Res := 1 + Insertions(True); end; if Res < MinRes then MinRes := Res; write(MinRes); end.
ех, якби не NewArea... в мене за неї 22 бали... :-(((
Поза форумом
У меня чего-то сейчас недоступна страница NetOI... и поэтому я не могу протестить своё решение ( может кто-нибудь скажет почему такое решение Mayor2 набирает 38б ?
#include<cstdio> #define max(x,y) (x>y?x:y) short f[1000][1000]; int i,j,n,p; main(){ for(scanf("%d%d",&n,&p);p;--p){ scanf("%d%d",&i,&j); if(i>=1 && i<=n && j>=1 && j<=n) f[n-i][j-1]=1; } for(i=1;i<n;++i) for(j=1;j<n;++j) if(f[i][j])f[i][j]+=f[i-1][j-1]; else f[i][j]=max(f[i-1][j],f[i][j-1]); printf("%hd\n",f[n-1][n-1]); return 0; }
Відредаговано xXx (2006-12-02 08:44:52)
Поза форумом
xXx написав:
У меня чего-то сейчас недоступна страница NetOI... и поэтому я не могу протестить своё решение ( может кто-нибудь скажет почему такое решение Mayor2 набирает 38б ?
ТЛ
Поза форумом
alex_kasycky написав:
xXx написав:
У меня чего-то сейчас недоступна страница NetOI... и поэтому я не могу протестить своё решение ( может кто-нибудь скажет почему такое решение Mayor2 набирает 38б ?
ТЛ
а мне дало WA
Поза форумом
Dark_Dimius написав:
а мне дало WA
Попробуй еще раз. Именно 38 баллов? Я еще раз проверил все тесты проходит.
(некоторые на грани => ТЛ)
Поза форумом
xXx написав:
Дайте плиз ссылку на онлайн-проверку...
http://www2.olymp.vinnica.ua/cgi-bin/v_ … mand=check
А вобще, у меня получилось 40 из 40.
ЗЫ Тебе повезло, а то...
Поза форумом