На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
1. Временная ложность:
wood: o(n)
dsp: o(m*n*(m+n))
building: o(m*nj*min(m,n))
primenum: o(ln(maxlongint)^3/(ln(a)*ln(b)*ln(c))*ln(ln(maxlongint)^3/(ln(a)*ln(b)*ln(c))))
country: o(n)
2. Тесты: http://www.proveryalka.narod.ru/tests.html
3. Решения: http://www.h0h0l.narod.ru
4. Оценка сложности задач:
COUNTRY - 20
BUILDING - 30
PRIMENUM - 30
WOOD - 50
DSP - 50
Поза форумом
Самое прикольное решение ДСП::-)
Ответ (a*b)div(x*y)
Поза форумом
Кстати у тебя в решениях решения только первого тура...
Поза форумом
jack_spektor написав:
Кстати у тебя в решениях решения только первого тура...
Второго тоже
Поза форумом
Проверьте тест 16 для COUNTRY у меня один ответ а у моего друга - другой...
Обе проги верные, а тест большой и руками не посчитать....
Поза форумом
Решение это хорошо,а лучше б смысл объяснил.
Вот например твоего решения Билдинга
Поза форумом
jack_spektor написав:
Решение это хорошо,а лучше б смысл объяснил.
Вот например твоего решения Билдинга
Я голосом и то тупо объясняю, а текстом...
Поза форумом
Вот мой алгоритм Билдинга:
Есть три функции:
1.Проверяет есть ли данная часть территории полностью пригодной
Параметры:
координаты начала,длина
2.Проверяет сколько в данном ряде есть максимально подряд таких территорий
3.Находит максимальное значение для всех рядов(2)
4.Находит максимальное для всех длин
max=(3)*длину
Всё
Поза форумом
jack_spektor написав:
Вот мой алгоритм Билдинга:
Есть три функции:
1.Проверяет есть ли данная часть территории полностью пригодной
Параметры:
координаты начала,длина
2.Проверяет сколько в данном ряде есть максимально подряд таких территорий
3.Находит максимальное значение для всех рядов(2)
4.Находит максимальное для всех длин
max=(3)*длину
Всё
Я же говорил - тектом не объяснить!
Ничего не понял
Поза форумом
jack_spektor написав:
Вот мой алгоритм Билдинга:
Есть три функции:
1.Проверяет есть ли данная часть территории полностью пригодной
Параметры:
координаты начала,длина
2.Проверяет сколько в данном ряде есть максимально подряд таких территорий
3.Находит максимальное значение для всех рядов(2)
4.Находит максимальное для всех длин
max=(3)*длину
Всё
Лично я не понял есть и легше алгоритмы!!!
Поза форумом
jack_spektor написав:
Вот мой алгоритм Билдинга:
Есть три функции:
1.Проверяет есть ли данная часть территории полностью пригодной
Параметры:
координаты начала,длина
2.Проверяет сколько в данном ряде есть максимально подряд таких территорий
3.Находит максимальное значение для всех рядов(2)
4.Находит максимальное для всех длин
max=(3)*длину
Всё
Сколько действий?
Поза форумом
Как смог так и сделал.
Чем легче алгоритм-тем сложнее до него додуматься :-)
Поза форумом
jack_spektor написав:
Самое прикольное решение ДСП::-)
Ответ (a*b)div(x*y)
Ах если бы, если бы... К сожалению, не проходит даже тест 21 21 11 11,
Поза форумом
ROBOT написав:
Проверьте тест 16 для COUNTRY у меня один ответ а у моего друга - другой...
Обе проги верные, а тест большой и руками не посчитать....
Подозреваю тест 16. Моя прога выдала ответ 11190.
Поза форумом
Вот мои решения:
Wood:O(n* log(maxh))
#include <iostream> #include <cmath> using namespace std; const int maxN=500; const int afterComa=3; const double mult=pow(10.0,(double)afterComa+1.0); struct section { double length; double miny,maxy; }; int n; section sects[maxN]; double under(double y) { int i; double perim; for(i=0,perim=0.0;i<n;i++) if(sects[i].maxy<=y)perim+=sects[i].length; else if(sects[i].miny<y) { perim+=sects[i].length*(y-sects[i].miny)/ (sects[i].maxy-sects[i].miny); } return perim; } int main() { double min,max,mid,ro,perim; int i; double x1,y1,x,y,xprv,yprv; cin>>n>>x1>>y1; max=y1; for(xprv=x1,yprv=y1,i=1,perim=0.0;i<n;i++,xprv=x,yprv=y) { cin>>x>>y; if(y>yprv) { sects[i].maxy=y; sects[i].miny=yprv; } else { sects[i].maxy=yprv; sects[i].miny=y; } sects[i].length=sqrt((x-xprv)*(x-xprv)+(y-yprv)*(y-yprv)); if(max<y)max=y; perim+=sects[i].length; } if(y1>yprv) { sects[0].maxy=y1; sects[0].miny=yprv; } else { sects[0].maxy=yprv; sects[0].miny=y1; } sects[0].length=sqrt((x1-xprv)*(x1-xprv)+(y1-yprv)*(y1-yprv)); perim+=sects[0].length; cin>>ro; min=0.0; perim*=ro; while(floor(min*mult+0.5)!=floor(max*mult+0.5)) { mid=(min+max)/2.0; if(under(mid)>=perim)max=mid; else min=mid; } cout.setf(ios::fixed); cout.precision(afterComa); cout<<min<<endl; return 0; }
Dsp:O(m*n*(m+n))
#include <iostream> using namespace std; const int maxMN=201; int main() { int a,b,m,n; unsigned short counts[maxMN][maxMN]={0}; int i,j,k,tmp; cin>>m>>n>>a>>b; counts[a][b]=counts[b][a]=1; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { for(k=1;k<=i-k;k++) if(counts[i][j]<(tmp=counts[k][j]+counts[i-k][j])) counts[i][j]=tmp; for(k=1;k<=j-k;k++) if(counts[i][j]<(tmp=counts[i][k]+counts[i][j-k])) counts[i][j]=tmp; } cout<<counts[m][n]<<endl; return 0; }
Building:O(m*n)
#include <iostream> using namespace std; const int maxMN=200; int main() { int high[maxMN+2]={0}; int stk[maxMN+2][2]; int m,n,i,j,stkptr,curr,maxs,s,st; cin>>m>>n; for(i=0,maxs=0;i<m;i++) { stkptr=0; stk[0][0]=0; stk[0][1]=-1; for(j=0;j<n;j++) { cin>>curr; if(!curr)high[j]=0; else high[j]++; for(st=j;high[j]<stk[stkptr][0];stkptr--) { s=(j-stk[stkptr][1])*stk[stkptr][0]; if(s>maxs)maxs=s; st=stk[stkptr][1]; } if(high[j]>stk[stkptr][0]) { stk[++stkptr][0]=high[j]; stk[stkptr][1]=st; } } for(;stkptr>0;stkptr--) { s=(n-stk[stkptr][1])*stk[stkptr][0]; if(s>maxs)maxs=s; } } cout<<maxs<<endl; return 0; }
Primenum:O(l)
#include <iostream> #include <climits> using namespace std; const int primesCnt=3; const int maxL=5000; unsigned long long nums[maxL]; int main() { int i,j,l; unsigned long long primes[primesCnt],lasts[primesCnt]; unsigned long long minNum; for(i=0;i<primesCnt;i++) { cin>>primes[i]; lasts[i]=0; } cin>>l; for(nums[0]=1,i=1;i<l;i++) { for(minNum=ULONG_LONG_MAX,j=0;j<primesCnt;j++) { while(nums[lasts[j]]*primes[j]<=nums[i-1])lasts[j]++; if(nums[lasts[j]]*primes[j]<minNum)minNum=nums[lasts[j]]*primes[j]; } nums[i]=minNum; } cout<<nums[l-1]<<endl; return 0; }
Country:O(n)
#include <iostream> using namespace std; const int maxN=50000; inline int min(int a,int b) { if(a<b)return a; else return b; } int main() { char families[maxN]; int n,i,j,ans,curr; int famcnts[3]={0}; int cnts[3][3]={0}; cin>>n; for(i=0;i<n;i++) { cin>>families[i]; families[i]-='1'; famcnts[families[i]]++; } for(i=0;i<famcnts[0];i++) cnts[0][families[i]]++; for(j=0;j<famcnts[2];i++,j++) cnts[2][families[i]]++; for(j=0;j<famcnts[1];i++,j++) cnts[1][families[i]]++; ans=0; //1-2-3 curr=min(min(cnts[0][1],cnts[1][2]),cnts[2][0]); cnts[0][1]-=curr; cnts[1][2]-=curr; cnts[2][0]-=curr; ans+=curr; //1-3-2 curr=min(min(cnts[0][2],cnts[2][1]),cnts[1][0]); cnts[0][2]-=curr; cnts[2][1]-=curr; cnts[1][0]-=curr; ans+=curr; //1-2 curr=min(cnts[0][1],cnts[1][0]); cnts[0][1]-=curr; cnts[1][0]-=curr; ans+=curr; //1-3 curr=min(cnts[0][2],cnts[2][0]); cnts[0][2]-=curr; cnts[2][0]-=curr; ans+=curr; //2-3 curr=min(cnts[1][2],cnts[2][1]); cnts[1][2]-=curr; cnts[2][1]-=curr; ans+=curr; cout<<ans<<endl; return 0; }
Поза форумом
Ура! Пашет
wood 40/40
Поза форумом
странно, как оно работает?
Поза форумом
Круто у меня в WOOD 40/40, в DSP 40/40, а что значит 161/161 в Primenum? Почему не 40?
Поза форумом
Скажи честно, взятку дал?
Поза форумом
Да, Онлайн взятка!!!
Поза форумом
Объясните, пожалуйста, как в DSP может быть при тесте
22 16 5 3
ответ
22
???
У меня больше, чем 21 не получается (даже вручную...)
Поза форумом
reiten написав:
Вот мои решения:
Wood:O(n* log(maxh))Код:
#include <iostream> #include <cmath> using namespace std; const int maxN=500; const int afterComa=3; const double mult=pow(10.0,(double)afterComa+1.0); struct section { double length; double miny,maxy; }; int n; section sects[maxN]; double under(double y) { int i; double perim; for(i=0,perim=0.0;i<n;i++) if(sects[i].maxy<=y)perim+=sects[i].length; else if(sects[i].miny<y) { perim+=sects[i].length*(y-sects[i].miny)/ (sects[i].maxy-sects[i].miny); } return perim; } int main() { double min,max,mid,ro,perim; int i; double x1,y1,x,y,xprv,yprv; cin>>n>>x1>>y1; max=y1; for(xprv=x1,yprv=y1,i=1,perim=0.0;i<n;i++,xprv=x,yprv=y) { cin>>x>>y; if(y>yprv) { sects[i].maxy=y; sects[i].miny=yprv; } else { sects[i].maxy=yprv; sects[i].miny=y; } sects[i].length=sqrt((x-xprv)*(x-xprv)+(y-yprv)*(y-yprv)); if(max<y)max=y; perim+=sects[i].length; } if(y1>yprv) { sects[0].maxy=y1; sects[0].miny=yprv; } else { sects[0].maxy=yprv; sects[0].miny=y1; } sects[0].length=sqrt((x1-xprv)*(x1-xprv)+(y1-yprv)*(y1-yprv)); perim+=sects[0].length; cin>>ro; min=0.0; perim*=ro; while(floor(min*mult+0.5)!=floor(max*mult+0.5)) { mid=(min+max)/2.0; if(under(mid)>=perim)max=mid; else min=mid; } cout.setf(ios::fixed); cout.precision(afterComa); cout<<min<<endl; return 0; }Dsp:O(m*n*(m+n))
Код:
#include <iostream> using namespace std; const int maxMN=201; int main() { int a,b,m,n; unsigned short counts[maxMN][maxMN]={0}; int i,j,k,tmp; cin>>m>>n>>a>>b; counts[a][b]=counts[b][a]=1; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { for(k=1;k<=i-k;k++) if(counts[i][j]<(tmp=counts[k][j]+counts[i-k][j])) counts[i][j]=tmp; for(k=1;k<=j-k;k++) if(counts[i][j]<(tmp=counts[i][k]+counts[i][j-k])) counts[i][j]=tmp; } cout<<counts[m][n]<<endl; return 0; }Building:O(m*n)
Код:
#include <iostream> using namespace std; const int maxMN=200; int main() { int high[maxMN+2]={0}; int stk[maxMN+2][2]; int m,n,i,j,stkptr,curr,maxs,s,st; cin>>m>>n; for(i=0,maxs=0;i<m;i++) { stkptr=0; stk[0][0]=0; stk[0][1]=-1; for(j=0;j<n;j++) { cin>>curr; if(!curr)high[j]=0; else high[j]++; for(st=j;high[j]<stk[stkptr][0];stkptr--) { s=(j-stk[stkptr][1])*stk[stkptr][0]; if(s>maxs)maxs=s; st=stk[stkptr][1]; } if(high[j]>stk[stkptr][0]) { stk[++stkptr][0]=high[j]; stk[stkptr][1]=st; } } for(;stkptr>0;stkptr--) { s=(n-stk[stkptr][1])*stk[stkptr][0]; if(s>maxs)maxs=s; } } cout<<maxs<<endl; return 0; }Primenum:O(l)
Код:
#include <iostream> #include <climits> using namespace std; const int primesCnt=3; const int maxL=5000; unsigned long long nums[maxL]; int main() { int i,j,l; unsigned long long primes[primesCnt],lasts[primesCnt]; unsigned long long minNum; for(i=0;i<primesCnt;i++) { cin>>primes[i]; lasts[i]=0; } cin>>l; for(nums[0]=1,i=1;i<l;i++) { for(minNum=ULONG_LONG_MAX,j=0;j<primesCnt;j++) { while(nums[lasts[j]]*primes[j]<=nums[i-1])lasts[j]++; if(nums[lasts[j]]*primes[j]<minNum)minNum=nums[lasts[j]]*primes[j]; } nums[i]=minNum; } cout<<nums[l-1]<<endl; return 0; }Country:O(n)
Код:
#include <iostream> using namespace std; const int maxN=50000; inline int min(int a,int b) { if(a<b)return a; else return b; } int main() { char families[maxN]; int n,i,j,ans,curr; int famcnts[3]={0}; int cnts[3][3]={0}; cin>>n; for(i=0;i<n;i++) { cin>>families[i]; families[i]-='1'; famcnts[families[i]]++; } for(i=0;i<famcnts[0];i++) cnts[0][families[i]]++; for(j=0;j<famcnts[2];i++,j++) cnts[2][families[i]]++; for(j=0;j<famcnts[1];i++,j++) cnts[1][families[i]]++; ans=0; //1-2-3 curr=min(min(cnts[0][1],cnts[1][2]),cnts[2][0]); cnts[0][1]-=curr; cnts[1][2]-=curr; cnts[2][0]-=curr; ans+=curr; //1-3-2 curr=min(min(cnts[0][2],cnts[2][1]),cnts[1][0]); cnts[0][2]-=curr; cnts[2][1]-=curr; cnts[1][0]-=curr; ans+=curr; //1-2 curr=min(cnts[0][1],cnts[1][0]); cnts[0][1]-=curr; cnts[1][0]-=curr; ans+=curr; //1-3 curr=min(cnts[0][2],cnts[2][0]); cnts[0][2]-=curr; cnts[2][0]-=curr; ans+=curr; //2-3 curr=min(cnts[1][2],cnts[2][1]); cnts[1][2]-=curr; cnts[2][1]-=curr; ans+=curr; cout<<ans<<endl; return 0; }
Данилка,нормальные люди на С не пишут!!!
Поза форумом
ROBOT написав:
1. Временная ложность:
wood: o(n)
dsp: o(m*n*(m+n))
building: o(m*nj*min(m,n))
primenum: o(ln(maxlongint)^3/(ln(a)*ln(b)*ln(c))*ln(ln(maxlongint)^3/(ln(a)*ln(b)*ln(c))))
country: o(n)
2. Тесты: http://www.proveryalka.narod.ru/tests.html
3. Решения: http://www.h0h0l.narod.ru
4. Оценка сложности задач:
COUNTRY - 20
BUILDING - 30
PRIMENUM - 30
WOOD - 50
DSP - 50
Сколько у тебя баллов,умник?
Поза форумом
Bot17 написав:
Данилка,нормальные люди на С не пишут!!!
Как раз наоборот. На С пишут нормальные люди. Доказательство тому - турнирная таблица. Ты там где, умник? Сиди себе со своим паскалем.
Поза форумом
reiten написав:
Bot17 написав:
Данилка,нормальные люди на С не пишут!!!
Как раз наоборот. На С пишут нормальные люди. Доказательство тому - турнирная таблица. Ты там где, умник? Сиди себе со своим паскалем.
К 11 классу буду учит Си
Поза форумом