Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: 1132 AI  (Citit de 5458 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
Marius
Nu mai tace
*****

Karma: 154
Deconectat Deconectat

Mesaje: 572



Vezi Profilul
« : Aprilie 13, 2011, 10:57:01 »

Aici puteti discuta despre problema Ai.
« Ultima modificare: Aprilie 13, 2011, 12:45:54 de către Gabriel Bitis » Memorat

Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
VisuianMihai
De-al casei
***

Karma: -9
Deconectat Deconectat

Mesaje: 121



Vezi Profilul
« Răspunde #1 : Noiembrie 12, 2011, 20:07:48 »

Se afla pe infoarena si cealalta problema de la ofi 2011 ?? Cea cu expresia...
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #2 : Noiembrie 12, 2011, 20:13:35 »

Uite-o aici.
Memorat
SebiSebi
Nu mai tace
*****

Karma: 76
Deconectat Deconectat

Mesaje: 306



Vezi Profilul
« Răspunde #3 : Decembrie 02, 2011, 19:47:08 »

Am vazut ca imi dadea incorect la a doua cerinta pe unele teste si nu gaseam greseala, apoi am loat testele oficiale si am vazut ca afisa corect. Este o problema cu evaluatorul? Daca nu poate sa imi spuna cineva ce gresesc? Multumesc anticipat!
Memorat
Gady_paul
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #4 : Ianuarie 06, 2012, 13:04:48 »

Am si eu o mica chestie la problema asta. Merge bine...dar imi iese din timp. Ca idee...pentru determinarea lungimii maxime a zidului...am sortat toate punctele dupa x, am pus intr-un vector toate punctele care au acelasi x, am sortat vectorul dupa y si am numarat cate sunt consecutive. Apoi...am sortat dupa y, am pus toate cele egale intr-un vector...sortat dupa x...numarat consecutive...si la sfarsit...am luat cel mai mare numar. Apoi am luat fircare sursa cu tinta, am calculat ecuatia dreptei...apoi am iterat pe x...si am cautat valorile lui x pentru care y e numar intreg...si am cautat toate punctele respective si le-am introdus intr-un vector. apoi am luat toate punctele respective...si am calculat cu un lee distanta. E vreo metoda mai eficienta?
Memorat
S7012MY
Nu mai tace
*****

Karma: 26
Deconectat Deconectat

Mesaje: 648



Vezi Profilul
« Răspunde #5 : Ianuarie 06, 2012, 18:51:43 »

Pentru determinarea lungimii maxime tu faci N^2 log N calcule dar poti sa faci doar N^2. Am impresia ca te-ai complicat.
Memorat
Gady_paul
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #6 : Ianuarie 06, 2012, 23:04:43 »

Ok.....si cum se face mai simplu?
Memorat
tzipleatud
De-al casei
***

Karma: 104
Deconectat Deconectat

Mesaje: 117



Vezi Profilul
« Răspunde #7 : Ianuarie 10, 2012, 22:53:28 »

Cu un algoritm de tip Fill
Memorat
Mitza444
Client obisnuit
**

Karma: 6
Deconectat Deconectat

Mesaje: 82



Vezi Profilul
« Răspunde #8 : Ianuarie 11, 2012, 16:57:04 »

Am si eu o problema....Am rezolvat problema imi da bine pe exemplu si pe cateva teste mai mici ,dar la cele mai mari tot iau killed by signal 11.
In memrie cred ca ma incadrez deoarece limita e destul de mare ,dar imi da o eroare ceva de genul ca un ciclu infinit si nu reusesc sa-mi dau seama nici cum care e problema.Ma puteti ajuta??(cred totusi ca problema la Lee)
Aici aveti sursa si ce mesaj imi da compilatoru:
http://infoarena.ro/job_detail/660028
http://infoarena.ro/job_detail/660028?action=view-source

Memorat
S7012MY
Nu mai tace
*****

Karma: 26
Deconectat Deconectat

Mesaje: 648



Vezi Profilul
« Răspunde #9 : Ianuarie 11, 2012, 17:07:34 »

Cred ca iesi din limita cozii Smile
Memorat
Mitza444
Client obisnuit
**

Karma: 6
Deconectat Deconectat

Mesaje: 82



Vezi Profilul
« Răspunde #10 : Ianuarie 11, 2012, 19:19:13 »

Nu inteleg de ce nu merge ca am facut 2 Lee-uri si am pus if-uri cu toate cazurile cand apara tinta si am retinut minimurile (cand este pe aceeasi linie sau coloana cu sursa,cand e pe diagonala daca e posibil si cand robotul e in acelasi loc cu sursa ) Annoyed .Am pus si marimea cozii mai mare,dar inca iau killed by signal 11 la cateva teste Angry + ca unele teste nu merg.
Cod:
#include<cstdio>
using namespace std;
#define kmax 500000
int n,T1,T2,S1,S2,S3,S4,R1,R2,R3,R4,k,min1=1001,min2=1001,min3=1001,min4=1001;
int mat[1001][1001],mat2[1001][1001];
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
int q1[kmax][3],q2[kmax][3];
int abs(int plm){
if(plm<0)
plm=-plm;
return plm;
}
int max(int a,int b){
if(a>b)
return a;
return b;
}
int min(int a,int b){
if(a<b)
return a;
return b;
}
int zid(int i,int j){
int j2=j,l1=1,l2=1;
while(mat[i][j2+1]==-1){
j2++;
l1++;
}
while(mat[i+1][j]==-1){
i++;
l2++;
}
if(l1>l2)
return l1;
return l2;
}
int Lee (){
int p,u,xnou,ynou,tmp,x,y,d;
q1[1][1]=R1;q1[1][2]=R2;
q2[1][1]=R3;q2[1][2]=R4;
for(p=1,u=1;p<=u;p++){
x=q1[p][1];y=q1[p][2];
for(d=0;d<4;d++){
xnou=x+dx[d];
ynou=y+dy[d];
if(xnou>=1 && xnou<=n && ynou>=1 && ynou<=n && mat[xnou][ynou]==0){
mat[xnou][ynou]=mat[x][y]+1;
q1[++u][1]=xnou;
q1[u][2]=ynou;
if((xnou==S1 && xnou==T1 && ynou>min(S2,T2) && ynou<max(S2,T2))||(ynou==S2 && ynou==T2 && xnou>min(S1,T1) && xnou<max(S1,T1))){
if(mat[xnou][ynou]<min1)
min1=mat[xnou][ynou];
}
if((xnou==S3 && xnou==T1 && ynou>min(S4,T2) && ynou<max(S4,T2)) || (ynou==S4 && ynou==T2 && xnou>min(S3,T1) && xnou<max(S3,T1))){
if(mat[xnou][ynou]<min2)
min2=mat[xnou][ynou];
}
if(abs(xnou-S1)==abs(ynou-S2) && abs(xnou-T1)==abs(ynou-T2) && xnou>min(S1,T1) && xnou<max(S1,T1) && ynou>min(S2,T2) && ynou<max(S2,T2)){
if(mat[xnou][ynou]<min1)
min1=mat[xnou][ynou];
}
if(abs(xnou-S3)==abs(ynou-S4) && abs(xnou-T1)==abs(ynou-T2) && xnou>min(S3,T1) && xnou<max(S3,T1) && ynou>min(S4,T2) && ynou<max(S4,T2)){
if(mat[xnou][ynou]<min2)
min2=mat[xnou][ynou];
}
if(xnou==S1 && ynou==S2){
if(mat[xnou][ynou]<min1)
min1=mat[xnou][ynou];
}
if(xnou==S3 && ynou==S4){
if(mat[xnou][ynou]<min2)
min2=mat[xnou][ynou];
}
}
}
}
for(p=1,u=1;p<=u;p++){
x=q2[p][1];y=q2[p][2];
for(d=0;d<4;d++){
xnou=x+dx[d];
ynou=y+dy[d];
if(xnou>=1 && xnou<=n && ynou>=1 && ynou<=n && mat2[xnou][ynou]==0){
mat2[xnou][ynou]=mat2[x][y]+1;
q2[++u][1]=xnou;
q2[u][2]=ynou;
if((xnou==S1 && xnou==T1 && ynou>min(S2,T2) && ynou<max(S2,T2))||(ynou==S2 && ynou==T2 && xnou>min(S1,T1) && xnou<max(S1,T1))){
if(mat2[xnou][ynou]<min3)
min3=mat2[xnou][ynou];
}
if((xnou==S3 && xnou==T1 && ynou>min(S4,T2) && ynou<max(S4,T2)) || (ynou==S4 && ynou==T2 && xnou>min(S3,T1) && xnou<max(S3,T1))){
if(mat2[xnou][ynou]<min4)
min4=mat2[xnou][ynou];
}
if(abs(xnou-S1)==abs(ynou-S2) && abs(xnou-T1)==abs(ynou-T2) && xnou>min(S1,T1) && xnou<max(S1,T1) && ynou>min(S2,T2) && ynou<max(S2,T2)){
if(mat2[xnou][ynou]<min3)
min3=mat2[xnou][ynou];
}
if(abs(xnou-S3)==abs(ynou-S4) && abs(xnou-T1)==abs(ynou-T2) && xnou>min(S3,T1) && xnou<max(S3,T1) && ynou>min(S4,T2) && ynou<max(S4,T2)){
if(mat2[xnou][ynou]<min4)
min4=mat2[xnou][ynou];
}
if(xnou==S1 && ynou==S2){
if(mat2[xnou][ynou]<min3)
min3=mat2[xnou][ynou];
}
if(xnou==S3 && ynou==S4){
if(mat2[xnou][ynou]<min4)
min4=mat2[xnou][ynou];
}
}
}
}
tmp=min(max(min1,min4),max(min2,min3));
return tmp;
}

int main(){
int i,j,maxz=0,xx,yy,timp;
freopen("ai.in","r",stdin);
freopen("ai.out","w",stdout);
scanf("%d",&n);
scanf("%d%d%d%d%d%d%d%d%d%d",&T1,&T2,&S1,&S2,&S3,&S4,&R1,&R2,&R3,&R4);
scanf("%d",&k);
for(i=1;i<=k;i++){
scanf("%d%d",&xx,&yy);
mat[xx][yy]=-1;
}
mat[T1][T2]=-2;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
mat2[i][j]=mat[i][j];
if(mat[i][j]==-1)
if(zid(i,j)>maxz)
maxz=zid(i,j);
}
}
timp=Lee();
printf("%d\n",maxz);
printf("%d\n",timp);
return 0;
}
Memorat
IronKing
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 2



Vezi Profilul
« Răspunde #11 : Aprilie 22, 2013, 10:49:23 »

Salutare!
Am rezolvat doar prima cerință momentan si imi dă raspuns greșit la testul 12 si 20. Imi poate arata cineva fișierul de intrare pentru testele astea sau sa imi explice ce greșesc (cod: http://www.infoarena.ro/job_detail/942399?action=view-source).
Mulțumesc anticipat!
Memorat
SebiSebi
Nu mai tace
*****

Karma: 76
Deconectat Deconectat

Mesaje: 306



Vezi Profilul
« Răspunde #12 : Aprilie 22, 2013, 14:12:29 »

Poti sa iti descarci testele de la OJI 2011, clasa a 10-a din meniul "Downloads".
Memorat
CosminRusu
De-al casei
***

Karma: 77
Deconectat Deconectat

Mesaje: 104



Vezi Profilul
« Răspunde #13 : Aprilie 25, 2013, 17:05:58 »

Nu inteleg de ce nu merge ca am facut 2 Lee-uri si am pus if-uri cu toate cazurile cand apara tinta si am retinut minimurile (cand este pe aceeasi linie sau coloana cu sursa,cand e pe diagonala daca e posibil si cand robotul e in acelasi loc cu sursa ) Annoyed .Am pus si marimea cozii mai mare,dar inca iau killed by signal 11 la cateva teste Angry + ca unele teste nu merg.
Cod:
#include<cstdio>
using namespace std;
#define kmax 500000
int n,T1,T2,S1,S2,S3,S4,R1,R2,R3,R4,k,min1=1001,min2=1001,min3=1001,min4=1001;
int mat[1001][1001],mat2[1001][1001];
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
int q1[kmax][3],q2[kmax][3];
int abs(int plm){
if(plm<0)
plm=-plm;
return plm;
}
int max(int a,int b){
if(a>b)
return a;
return b;
}
int min(int a,int b){
if(a<b)
return a;
return b;
}
int zid(int i,int j){
int j2=j,l1=1,l2=1;
while(mat[i][j2+1]==-1){
j2++;
l1++;
}
while(mat[i+1][j]==-1){
i++;
l2++;
}
if(l1>l2)
return l1;
return l2;
}
int Lee (){
int p,u,xnou,ynou,tmp,x,y,d;
q1[1][1]=R1;q1[1][2]=R2;
q2[1][1]=R3;q2[1][2]=R4;
for(p=1,u=1;p<=u;p++){
x=q1[p][1];y=q1[p][2];
for(d=0;d<4;d++){
xnou=x+dx[d];
ynou=y+dy[d];
if(xnou>=1 && xnou<=n && ynou>=1 && ynou<=n && mat[xnou][ynou]==0){
mat[xnou][ynou]=mat[x][y]+1;
q1[++u][1]=xnou;
q1[u][2]=ynou;
if((xnou==S1 && xnou==T1 && ynou>min(S2,T2) && ynou<max(S2,T2))||(ynou==S2 && ynou==T2 && xnou>min(S1,T1) && xnou<max(S1,T1))){
if(mat[xnou][ynou]<min1)
min1=mat[xnou][ynou];
}
if((xnou==S3 && xnou==T1 && ynou>min(S4,T2) && ynou<max(S4,T2)) || (ynou==S4 && ynou==T2 && xnou>min(S3,T1) && xnou<max(S3,T1))){
if(mat[xnou][ynou]<min2)
min2=mat[xnou][ynou];
}
if(abs(xnou-S1)==abs(ynou-S2) && abs(xnou-T1)==abs(ynou-T2) && xnou>min(S1,T1) && xnou<max(S1,T1) && ynou>min(S2,T2) && ynou<max(S2,T2)){
if(mat[xnou][ynou]<min1)
min1=mat[xnou][ynou];
}
if(abs(xnou-S3)==abs(ynou-S4) && abs(xnou-T1)==abs(ynou-T2) && xnou>min(S3,T1) && xnou<max(S3,T1) && ynou>min(S4,T2) && ynou<max(S4,T2)){
if(mat[xnou][ynou]<min2)
min2=mat[xnou][ynou];
}
if(xnou==S1 && ynou==S2){
if(mat[xnou][ynou]<min1)
min1=mat[xnou][ynou];
}
if(xnou==S3 && ynou==S4){
if(mat[xnou][ynou]<min2)
min2=mat[xnou][ynou];
}
}
}
}
for(p=1,u=1;p<=u;p++){
x=q2[p][1];y=q2[p][2];
for(d=0;d<4;d++){
xnou=x+dx[d];
ynou=y+dy[d];
if(xnou>=1 && xnou<=n && ynou>=1 && ynou<=n && mat2[xnou][ynou]==0){
mat2[xnou][ynou]=mat2[x][y]+1;
q2[++u][1]=xnou;
q2[u][2]=ynou;
if((xnou==S1 && xnou==T1 && ynou>min(S2,T2) && ynou<max(S2,T2))||(ynou==S2 && ynou==T2 && xnou>min(S1,T1) && xnou<max(S1,T1))){
if(mat2[xnou][ynou]<min3)
min3=mat2[xnou][ynou];
}
if((xnou==S3 && xnou==T1 && ynou>min(S4,T2) && ynou<max(S4,T2)) || (ynou==S4 && ynou==T2 && xnou>min(S3,T1) && xnou<max(S3,T1))){
if(mat2[xnou][ynou]<min4)
min4=mat2[xnou][ynou];
}
if(abs(xnou-S1)==abs(ynou-S2) && abs(xnou-T1)==abs(ynou-T2) && xnou>min(S1,T1) && xnou<max(S1,T1) && ynou>min(S2,T2) && ynou<max(S2,T2)){
if(mat2[xnou][ynou]<min3)
min3=mat2[xnou][ynou];
}
if(abs(xnou-S3)==abs(ynou-S4) && abs(xnou-T1)==abs(ynou-T2) && xnou>min(S3,T1) && xnou<max(S3,T1) && ynou>min(S4,T2) && ynou<max(S4,T2)){
if(mat2[xnou][ynou]<min4)
min4=mat2[xnou][ynou];
}
if(xnou==S1 && ynou==S2){
if(mat2[xnou][ynou]<min3)
min3=mat2[xnou][ynou];
}
if(xnou==S3 && ynou==S4){
if(mat2[xnou][ynou]<min4)
min4=mat2[xnou][ynou];
}
}
}
}
tmp=min(max(min1,min4),max(min2,min3));
return tmp;
}

int main(){
int i,j,maxz=0,xx,yy,timp;
freopen("ai.in","r",stdin);
freopen("ai.out","w",stdout);
scanf("%d",&n);
scanf("%d%d%d%d%d%d%d%d%d%d",&T1,&T2,&S1,&S2,&S3,&S4,&R1,&R2,&R3,&R4);
scanf("%d",&k);
for(i=1;i<=k;i++){
scanf("%d%d",&xx,&yy);
mat[xx][yy]=-1;
}
mat[T1][T2]=-2;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
mat2[i][j]=mat[i][j];
if(mat[i][j]==-1)
if(zid(i,j)>maxz)
maxz=zid(i,j);
}
}
timp=Lee();
printf("%d\n",maxz);
printf("%d\n",timp);
return 0;
}

Cred ca si tie ti-e greu sa intelegi ce si cum ai facut, asa ca nu te astepta la vreun raspuns la intrebarea ta, "De ce nu merge?". Cred ca cel mai bine ar fi sa faci LEE folosind coada ( queue ) din STL. Ca sa intelegi  mai bine cum functioneaza recomand problema Pietre2 de pe infoarena. Eu acolo am invatat cum si ce face queue-ul...
Sau daca nici asta nu te convinge sa inveti STL, atunci gandeste-te sa folosesti coada aceea circular.
Adica functiile, sau oriunde faci introducerea si extragerea unui elemnt din coada sa fie cam asa :
Cod:
void intr ( int c, int d )
{
       u=u+1;
       //Aici e smecheria, daca dai de limita cozii, incepi de la inceput
       if(u>20000)
            u=1;
       q[1][u]=c;
       q[2][u]=d;
}
//extrag un element din coada
void extr(int &c,int &d)
{
     p=p+1;
     //La fel procedezi si in cazul extragerii
     if(p>20000)
           p=1;
     c=q[1][p];
     d=q[2][p];
}

Cam astea ar fi modalitatile pe care eu le stiu pentru ca sa scapi de KBS si incorect.
Memorat
Sapientia
Strain
*

Karma: 0
Deconectat Deconectat

Mesaje: 29



Vezi Profilul
« Răspunde #14 : Decembrie 30, 2013, 20:19:41 »

Sa zicem ca avem un dreptunghi de lungime n si latime m(numere naturale diferite) si il impartim in nxm patratele de latura 1,apoi ducem o diagonalaa dreptunghiului.
Exista cazul in care diagonala acelui dreptunghi intersecteaza coltul unui patratel din dreptunghi?(inafara de colturile dreptunghiului)
Memorat
romircea2010
Strain
*

Karma: 18
Deconectat Deconectat

Mesaje: 35



Vezi Profilul
« Răspunde #15 : Decembrie 30, 2013, 20:56:12 »

Daca cmmdc(n, m) este diferit de 1 atunci exista cazul pe care l-ai identificat iar daca numerele n si m sunt prime intre ele atunci diagonala intersecteaza doar colturile dreptunghiului.
Memorat
hasmasandragos
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #16 : Februarie 04, 2015, 16:41:17 »

Daca robotii nu mai trebuie sa faca nici un pas sa protejeze tinta , se va afisa 0 ? Si cat va da pentru testul urmator ?
Cod:
6
4 4 1 1 6 6 2 2 5 5
3
1 3
1 4
1 5
Mie imi da:
Cod:
3
0
Memorat
ionut98
Strain
*

Karma: 2
Deconectat Deconectat

Mesaje: 44



Vezi Profilul
« Răspunde #17 : Februarie 19, 2015, 12:52:30 »

da asa e si mie tot atat imi da pe testul tau
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines