Afişează mesaje
|
Pagini: 1 [2]
|
28
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 1031 Cmmmc
|
: Iunie 28, 2011, 14:28:58
|
se poate uita cineva pe sirsa mea? nu reusesc sa vad ce e gresit am luat testele de la olimpiada si par sa mearga. nu vad vreo diferenta dar totusi iau 40 pe infoarena. #include<iostream> #include<fstream> #define N 500000 using namespace std;
ifstream in("cmmmc.in"); ofstream out("cmmmc.out");
int solmin=100000,sol1,sol2,nrp[144000],nr,fact[400],pu[400],n,sol[400]; bool z[N];
void erat() { int i,j; for(i=2;i*i<N;++i) { if(!z[i]) { nrp[++nr]=i; for(j=2*i;j<N;j+=i) z[j]=true; } } for(;i<N;++i) if(!z[i]) nrp[++nr]=i; }
void ver() { int i,nu1=1,nu2=1; for(i=1;i<=n;++i) { if(sol[i]==0) nu1*=fact[i]; else nu2*=fact[i]; } if(nu1+nu2<solmin) { solmin=nu1+nu2; sol1=nu1; sol2=nu2; if(sol1>sol2) swap(sol1,sol2); } }
void back(int q) { int i; if(q==n+1) { ver(); return; } for(i=0;i!=2;++i) { sol[q]=i; back(q+1); } }
int cmmmc(int p) { int i,nrr=1; n=0; solmin=100000; for(i=1;i<=nr;++i) { if(p%nrp[i]==0) { fact[++n]=1; pu[n]=0; while(p%nrp[i]==0) { p/=nrp[i]; ++pu[n]; fact[n]*=nrp[i]; } nrr*=(2*pu[n]+1); } } if(p!=1) { fact[++n]=p; pu[n]=1; nrr*=3; } nrr=(nrr+1)>>1; back(1); return nrr; }
int main() { int i,ni,k; erat(); in >> k; for(i=1;i<=k;++i) { in >> ni; out << cmmmc(ni) << " " << sol1 << " " << sol2 << "\n"; } return 0; }
|
|
|
30
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 399 Sum2
|
: Iunie 22, 2011, 15:23:02
|
stie cineva unde gresesc? am folosit deque cu sume partiale dar iau doar 50 #include<iostream> #include<fstream> #define N 100004
using namespace std;
ifstream in("sum2.in"); ofstream out("sum2.out");
int n,l,U,smax=-1000000,d[N],p=1,u,y[N]; short x[N];
inline void swap(int &a, int & b) { int t=a; a=b; b=t; }
inline void add(const int &a) { d[++u]=a; }
inline void stanga(int i) { if(p<=u && i - d[p]>= U) ++p; }
inline void dreapta() { while(u!=p && y[d[u]] <= y[d[u-1]]) { swap(d[u],d[u-1]); --u; } }
void so() { int i; for(i=0;i<U-l-1;++i) { add(i); dreapta(); } for(i=U;i<=n;++i) { stanga(i); add(i-l-1); dreapta(); if(y[i]-y[d[p]]>smax) smax=y[i]-y[d[p]]; } add(i-l-1); dreapta(); if(y[i-1]-y[d[p]]>smax) smax=y[i-1]-y[d[p]]; }
int main() { int i; in >> n >> l >> U; for(i=1;i<=n;++i) { in >> x[i]; y[i]=x[i] + y[i-1]; } so(); out << smax; return 0; }
|
|
|
34
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 953 Studenti
|
: Mai 22, 2011, 16:05:31
|
se poate uita cineva pe sursa mea? #include<stdio.h>
short n,h[301],g[301],hmax,gmax,nr1,nr2,g1max,h1max,gmin,hmin; int smin=2000000000,s;
int main() { int i,j,k; freopen("studenti.in","r",stdin); freopen("studenti.out","w",stdout); scanf("%d",&n); for(i=1;i<=n;++i) { scanf("%d%d",&h[i],&g[i]); if(h[i]>hmax) { nr1=i; hmax=h[i]; } if(g[i]>gmax) { nr2=i; gmax=g[i]; } } for(i=1;i<n;++i) for(j=i+1;j<=n;++j) if(i!=nr1 && i!=nr2) { s=(hmax+h[i]+h[j])*(gmax+g[i]+g[j]); if(s<smin) smin=s; } for(i=1;i<=n;++i) if(i!=nr1 && i!=nr2) { for(j=1;j<=n;++j) if(j!=nr2 && j!=i && j!=nr1) { gmin=20000; hmin=20000; g1max=0; h1max=0; for(k=1;k<=n;++k) if(k!=nr1 && k!=nr2 && k!=i && k!=j) { if((h[k]>h[i] && h[k]>h[nr2]) && (g[k]>g[j] && g[k]>g[nr1])) { if(h[k]>h1max) h1max=h[k]; if(g[k]>g1max) g1max=g[k]; } if(h[k]<hmin) hmin=h[k]; if(g[k]<=gmin) gmin=g[k]; } if(g1max!=0) { s=(hmax+h[i]+h1max)*(gmax+g[j]+g1max); if(s<smin) smin=s; } else { for(k=1;k<=n;++k) if(k!=nr1 && k!=nr2 && k!=i && k!=j) { s=(hmax+h[i]+h[k])*(gmax+g[j]+g[k]); if(s<smin) smin=s; } } } } printf("%d\n",smin); return 0; }
|
|
|
36
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 1087 Doi
|
: Mai 22, 2011, 08:57:37
|
nu inteleg ce gresesc poate sa se uite cineva pe sursa mea, va roog #include<stdio.h> #include<string.h>
int t,nrr[505],nr[505],a1,nu,a2,nr2[505]; char a[510];
void imp(int v[]) { int i,t=0; for(i=v[0];i>0;--i) { t=t*10+v[i]; v[i]=t/2; t%=2; } for(;v[v[0]]==0;--v[0]); } int smax(int a1,int a2) { if(a1>a2) return a1; return a2; } void add(int a) { int i,t=0; nrr[1]+=a; for(i=1;t || i<=nrr[0];++i,t/=10) { t+=nrr[i]; nrr[i]=t%10; } nrr[0]=smax(i-1,nrr[0]); } void add2(int a) { int i; nr2[1]-=a; for(i=1;i<=nr2[0];++i) { if(nr2[i]<0) { nr2[i]+=10; nr2[i+1]--; } } for(;!nr2[nr2[0]] && nr2[0]!=0;--nr2[0]); }
bool cmp() { int j; if(nrr[0]!=nr2[0]) return 0; for(j=nrr[0];j>0;--j) if(nrr[j]!=nr2[j]) return 0; return 1; }
int main() { int i,w; freopen("doi.in","r",stdin); freopen("doi.out","w",stdout); scanf("%d",&t); for(w=1;w<=t;++w) { scanf("%s",&a); a1=strlen(a); nu=0; nr[0]=0; for(i=a1-1;i>=0;--i) nr[++nr[0]]=a[i]-'0'; while(nr[0]!=0) { ++nu; if((nr[1]&1)==0) imp(nr); else { a1=0; for(i=0;i<=nr[0];++i) nrr[i]=nr[i]; add(1); while((nrr[1]&1)==0) { ++a1; imp(nrr); } a2=0; for(i=0;i<=nr[0];++i) nr2[i]=nr[i]; add2(1); if(!nr2[0]) break; while((nr2[1]&1)==0) { ++a2; imp(nr2); } if(a2>a1) { if(cmp()) nu+=a1; else nu+=a2; for(i=0;i<=nr2[0];++i) nr[i]=nr2[i]; } else { if(cmp()) nu+=a2; else nu+=a1; for(i=0;i<=nrr[0];++i) nr[i]=nrr[i]; } } } printf("%d\n",nu); } return 0; }
|
|
|
39
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 014 Secventa
|
: Decembrie 14, 2010, 18:38:28
|
af facut o sursa cu deque COD: #include<iostream> #include<fstream> using namespace std; const int N=500001; int a,s,smax,dr,st=1,d[N],v[N],n,k; void stanga (int i) { while ((i-d[st]>=k) && (v[d[st]]<v[d[st+1]])) { ++st; } }
void dreapta (int i) { while (st<=dr && v[d[dr]]>=v[i]) { --dr; } }
void adauga (int i) { d[++dr]=i; }
ifstream aa("secventa.in"); ofstream ss("secventa.out"); int main () { smax=-10000; int i; aa >> n >> k; for (i=1;i<=n;++i) { aa >> v[i ]; stanga(i); dreapta(i); adauga(i); if (i>=k && v[d[st]]>smax) { smax=v[d[st]]; a=i-k+1; s=i; } } ss << a << " " << s << " " << smax; return 0; } si iau 10 pct. nu inteleg unde am gresit. ma poate ajuta cineva? Editat de moderator: foloseste tagurile [ code ] si [ /code ] cand postezi cod. Lasa spatiu intre parantezele drepte si litera i, ca altfel textul ce urmeaza va fi italic.
|
|
|
|