Afişează mesaje
|
Pagini: 1 2 3 [4] 5
|
76
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 477 Alee
|
: Februarie 11, 2013, 16:48:25
|
Sursa mea ia 60 de puncte . MLE pe testul 8 si pe restul pe care nu le-a trecut Incorect. Nu inteleg, am tratat cazul particular cand raspunsul e 0 si tot aceeasi treaba. Multumesc anticipat . #include <fstream> using namespace std; ifstream cin("alee.in"); ofstream cout("alee.out"); int n, m, l[180][180], q[4][31625], i,j , starti, startj, endi, endj, u, p; void init() { int x, y; cin>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=n;j++) l[i][j]=-2; for(i=1;i<=m;++i) { cin>>x>>y; l[x][y]=-1; } cin>>starti>>startj; l[starti][startj]=1; cin>>endi>>endj; l[endi][endj]=-3; q[1][1]=starti; q[2][1]=startj; } void intr(int c, int d) { u=u+1; q[1][u]=c; q[2][u]=d; } void extr(int &c, int &d) { p=p+1; c=q[1][p]; d=q[2][p]; } void lee() { int x, y; u=1; p=0; while(p!=u) { extr(x,y); if(x>1) if(l[x-1][y]>l[x][y]+1 || l[x-1][y]==-2 || l[x][y+1]==-3) { l[x-1][y]=l[x][y]+1; intr(x-1, y); } if(y>1) if(l[x][y-1]>l[x][y]+1 || l[x][y-1]==-2 || l[x][y+1]==-3) { l[x][y-1]=l[x][y]+1; intr(x, y-1); } if(y<n) if(l[x][y+1]>l[x][y]+1 || l[x][y+1]==-2|| l[x][y+1]==-3) { l[x][y+1]=l[x][y]+1; intr(x, y+1); } if(x<n) if(l[x+1][y]>l[x][y]+1 || l[x+1][y]==-2|| l[x+1][y]==-3) { l[x+1][y]=l[x][y]+1; intr(x+1, y); } } } void afisare() { // for(i=1;i<=n;i++) // { // for(j=1;j<=n;j++) // cout<<l[i][j]<<" "; // cout<<"\n"; // } if(l[endi][endj]==-3) cout<<"0\n"; else cout<<l[endi][endj]<<"\n"; } int main() { init(); lee(); afisare(); return 0; }
|
|
|
77
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 1215 Pescari
|
: Februarie 10, 2013, 16:31:00
|
#include<fstream> #include<iostream> using namespace std;
int a[1005][1005],i,j,ok,u,p,P,q[3][10005],c,d,y,m,sir[3][10005],maxi,l[1005][1005],n,k=0; ifstream fin("pescari.in"); ofstream g("pescari.out");
void init()
{
//citim datele din fisierul pescari.in fin>>n>>m>>P; // cout<<n; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { fin>>a[i][j]; l[i][j]=0; if(a[i][j]==2) {l[i][j]=0;k++;sir[1][k]=i;sir[2][k]=j;} } fin.close(); } //instroduc linia c si col d in coada void intr(int c,int d) { u=u+1; 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; if(p>20000) p=1;
c=q[1][p]; d=q[2][p]; }
//algoritmul LEE void lee() { int x, y; p=0;u=0; p=0; u=k; while(p!=u) { extr(x,y);
//vecinul de sus //daca are inaltime mai mare si numarul de catarari mai mic atunci //actualizez numarul de catarari cu l[x][y]+1 if(x>1)
if(a[x-1][y]==0 || a[x-1][y]==1) if((l[x-1][y]>l[x][y]+1||l[x-1][y]==0)) { l[x-1][y]=l[x][y]+1; intr(x-1,y);
}
// if(x<n) if(a[x+1][y]==0 || a[x+1][y]==1) if(l[x+1][y]>l[x][y]+1||l[x+1][y]==0) {l[x+1][y]=l[x][y]+1; intr(x+1,y);
}
if(y>1) if(a[x][y-1]==0 || a[x][y-1]==1) if(l[x][y-1]>l[x][y]+1 || l[x][y-1]==0) {l[x][y-1]=l[x][y]+1; intr(x,y-1);
} if(y<m) if(a[x][y+1]==0 || a[x][y+1]==1) if(l[x][y+1]>l[x][y]+1||l[x][y+1]==0) {l[x][y+1]=l[x][y]+1; intr(x,y+1);
} if(y<m && x<n) if(a[x+1][y+1]==0 || a[x+1][y+1]==1) if(l[x+1][y+1]>l[x][y]+1||l[x+1][y+1]==0) {l[x+1][y+1]=l[x][y]+1; intr(x+1,y+1);}
if(y>1 && x<n) if(a[x+1][y-1]==0 || a[x+1][y-1]==1) if(l[x+1][y-1]>l[x][y]+1||l[x+1][y-1]==0) {l[x+1][y-1]=l[x][y]+1; intr(x+1,y-1);}
if(y<m && x>1) if(a[x-1][y+1]==0 || a[x-1][y+1]==1) if(l[x-1][y+1]>l[x][y]+1||l[x-1][y+1]==0) {l[x-1][y+1]=l[x][y]+1; intr(x-1,y+1);}
if(y>1 && x>1) if(a[x-1][y-1]==0 || a[x-1][y-1]==1) if(l[x-1][y-1]>l[x][y]+1||l[x-1][y-1]==0) {l[x-1][y-1]=l[x][y]+1; intr(x-1,y-1);
}
}
} void scriere() {
for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(a[i][j]==1) g<<l[i][j]<<"\n"; } int main() {
init(); for(i=1;i<=k;i++) { q[1][i]=sir[1][i]; q[2][i]=sir[2][i]; } lee(); scriere();
return 0; }
Sursa mea ia 50 de puncte. Pe restul testelor avand Incorect. As ramane profund indatorat daca cineva mi-ar explica unde si de ce gresesc . Numai bine !
|
|
|
83
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 474 Teams
|
: Ianuarie 05, 2013, 18:34:47
|
Buna. Am incercat sa rezolv problema asta cu cautare binara. Am doua surse una care ia 90 de puncte cu TLE pe ultimul test, si una cu 0 puncte cu Incorect pe fiecare. Prima face citirea pe streamuri, iar a doua parsata. Am incercat si cu printf si scanf dar au avut acelasi rezultat ca streamurile. Aici sunt cele doua surse #include<fstream> using namespace std; long long n, a[100001]; long long A,B,c,i,j; void quickSort(long long arr[], long long left, long long right) { long long i = left, j = right; long long tmp; long long pivot = arr[(left + right) / 2]; /* partition */ while (i <= j) { while (arr[i] < pivot) i++; while (arr[j] > pivot) j--; if (i <= j) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } }; /* recursion */ if (left < j) quickSort(arr, left, j); if (i < right) quickSort(arr, i, right); } int caz1(int b, int li) { int ls=n, mij, fin; while( li<=ls) { mij=(li+ls)/2; if (a[mij]<=b) { fin=mij; li=mij+1; } else ls=mij-1; } return fin; } int caz2(int b, int li) { int ls=n,mij,fin; while(li<=ls) { mij=(li+ls)/2; if (a[mij]>=b) { fin=mij; ls=mij-1; } else li=mij+1; } return fin; } int main() { ifstream cin("teams.in"); ofstream cout("teams.out"); cin>>n>>A>>B; for(i=1;i<=n;i++) cin>>a[i]; cin.close(); quickSort(a, 1, n); for(i=1;i<n;i++) if(a[i]+a[i+1]<=B) { //cout<<a[i]<< " "<<caz1(B-a[i], i+1)-caz2(A-a[i], i+1); c+=caz1(B-a[i], i+1)-caz2(A-a[i], i+1)+1 ;} cout<<c; cout.close(); return 0; }
#include<fstream> #include<string.h> using namespace std; long long n, a[100001]; char s[100005]; long long A,B,c,i,j; void quickSort(long long arr[], long long left, long long right) { long long i = left, j = right; long long tmp; long long pivot = arr[(left + right) / 2]; /* partition */ while (i <= j) { while (arr[i] < pivot) i++; while (arr[j] > pivot) j--; if (i <= j) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } }; /* recursion */ if (left < j) quickSort(arr, left, j); if (i < right) quickSort(arr, i, right); } int caz1(int b, int li) { int ls=n, mij, fin; while( li<=ls) { mij=(li+ls)/2; if (a[mij]<=b) { fin=mij; li=mij+1; } else ls=mij-1; } return fin; } int caz2(int b, int li) { int ls=n,mij,fin; while(li<=ls) { mij=(li+ls)/2; if (a[mij]>=b) { fin=mij; ls=mij-1; } else li=mij+1; } return fin; } int main() { ifstream cin("teams.in"); ofstream cout("teams.out"); cin>>n>>A>>B; char abc[100]; cin.getline(abc, 100); cin.getline(s,100005); long long x=0; n=0; long aux=0; long poz=0; for (i=0;s[i];++i){ if (s[i]==' '){ a[++n]=aux; aux=0; } else aux=aux*10+s[i]-'0'; } a[++n]=aux; //for(i=1;i<=n;i++) // cout<<a[i]<<" "; cin.close(); quickSort(a, 1, n); for(i=1;i<n;i++) if(a[i]+a[i+1]<=B) { //cout<<a[i]<< " "<<caz1(B-a[i], i+1)-caz2(A-a[i], i+1); c+=caz1(B-a[i], i+1)-caz2(A-a[i], i+1)+1 ; } cout<<c; cout.close(); return 0; } Practic e aceeasi chestie, dar nu inteleg totusi de ce pe a doua sursa primesc incorect . Va rog sa ma ajutati sa inteleg ce si unde gresesc. Multumesc anticiat.
|
|
|
85
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 114 Muzeu
|
: Ianuarie 03, 2013, 14:27:24
|
//Problema muzeu #include<fstream> #include<iostream> using namespace std; int a[251][251],i,j,ok,u,p,q[3][20001],c,d,y,sir[3][100000],maxi,l[251][251],n,k=0; ifstream fin("muzeu.in"); ofstream g("muzeu.out"); void init() { //citim datele din fisierul muzeu.in fin>>n; // cout<<n; char c; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { fin>>c; if (c=='.') { a[i][j]=1; l[i][j]=-1; } else if (c=='P') {a[i][j]=10;k++;sir[1][k]=i;sir[2][k]=j;} else l[i][j]=-2; } fin.close(); } //instroduc linia c si col d in coada void intr(int c,int d) { u=u+1; 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; if(p>20000) p=1; c=q[1][p]; d=q[2][p]; } //algoritmul LEE void lee(int x,int y) { p=0;u=0; intr(x,y); while(p!=u) { extr(x,y); //vecinul de sus //daca are inaltime mai mare si numarul de catarari mai mic atunci //actualizez numarul de catarari cu l[x][y]+1 if(x>1) if(a[x-1][y]==1) if(l[x-1][y]>l[x][y]+1||l[x-1][y]==-1) {l[x-1][y]=l[x][y]+1; intr(x-1,y); } // if(x<n) if(a[x+1][y]==1) if(l[x+1][y]>l[x][y]+1||l[x+1][y]==-1) {l[x+1][y]=l[x][y]+1; intr(x+1,y); } if(y>1) if(a[x][y-1]==1) if(l[x][y-1]>l[x][y]+1||l[x][y-1]==-1) {l[x][y-1]=l[x][y]+1; intr(x,y-1); } if(y<n) if(a[x][y+1]==1) if(l[x][y+1]>l[x][y]+1||l[x][y+1]==-1) {l[x][y+1]=l[x][y]+1; intr(x,y+1); } } } void scriere() { for(i=1;i<=n;i++) {g<<"\n"; for(j=1;j<=n;j++) g<<l[i][j]<<" ";} maxi=-1; // for(i=1;i<=n;i++) // for(j=1;j<=n;j++) // if(l[i][j]>maxi) // maxi=l[i][j]; } int main() { init(); for(i=1;i<=k;i++) lee(sir[1][i],sir[2][i]); scriere(); return 0; } Ma puteti ajuta si pe mine sa vad ce gresesc aici ? Sursa mea nu trece doua dintre teste cu textul Time limit exceeded. Multumesc anticipat !
|
|
|
|