Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define N1 10
- #define N3 100001
- using namespace std;
- ifstream fin("butoi.in");
- ofstream fout("butoi.out");
- int C, V, N, K, P;
- int fr[N1], c[N1], minim=1000000;
- int sa, s, nr, cnt, sol2[N1], sol3;
- int c3[N3];
- long long sum, cat, cmin=100000000000;
- int main()
- {
- int i;
- fin>>C;
- fin>>V>>N>>K>>P;
- if(C==1 || C==2)
- {
- for(i=0; i<N; ++i)
- fin>>c[i];
- do
- {
- fr[N-1]++;
- s=0;sa=0;nr=0;
- for(i=N-1; i>=1; --i)
- {
- if(fr[i]>K)
- {
- fr[i]=fr[i]-(K+1);
- fr[i-1]=fr[i-1]+1;
- }
- s+=fr[i];
- nr+=fr[i];
- sa=sa+(c[i]*fr[i]);
- }
- s+=fr[0];
- nr+=fr[0];
- sa=sa+(c[0]*fr[0]);
- if(sa==V)
- {
- cnt++;
- if(nr<minim)
- {
- minim=nr;
- for(i=0; i<N; ++i)
- sol2[i]=fr[i];
- }
- }
- }
- while(s<N*K);
- if(C==1)
- {
- fout<<cnt;
- return 0;
- }
- else
- {
- for(i=0; i<N; ++i)
- fout<<sol2[i]<<" ";
- return 0;
- }
- }
- for(i=1; i<=N; ++i)
- {
- fin>>c3[i];
- if(i<=P)
- sum+=c3[i];
- }
- if(V%sum==0)
- {
- cat=V/sum;
- if(cat<cmin)
- {
- cmin=cat;
- sol3=1;
- }
- }
- for(i=P+1; i<=N; ++i)
- {
- sum=(sum-c3[i-P])+c3[i];
- if(V%sum==0)
- {
- cat=V/sum;
- if(cat<cmin)
- {
- cmin=cat;
- sol3=i-P+1;
- }
- }
- }
- fout<<sol3;
- return 0;
- }
- /**
- SO
- #include <fstream>
- #include <cassert>
- using namespace std;
- ifstream fin("butoi.in");
- ofstream fout("butoi.out");
- int C, n, k, p, Cv[200005], i, j, sol, cerinta, Smin = 1000000;
- int nr_v[10], nr_v_min[10];
- int calcul()
- {
- int i, S = 0; //calculez cantitatea de apa
- for (i = 1; i <= n; i++) S += nr_v[i] * Cv[i];
- return S;
- }
- void adun_1()
- {
- //adunare 1 in baza k+1
- int i = n; //plec de la sfarsit
- while (nr_v[i] == k)//cat timp cifra este k
- {
- nr_v[i] = 0; //pun 0 in locul ei si
- i--; //trec mai departe
- }
- nr_v[i]++; //ultima cifra (pozitia i) o maresc cu 1
- }
- void retine_min()
- {
- int i, S = 0;
- sol++; //mai am o solutie
- for (i = 1; i <= n; i++) S += nr_v[i];
- if (S < Smin) //am mai putine operatii?
- {
- Smin = S; //retin numarul minim de operatii
- for (i = 1; i <= n; i++) nr_v_min[i] = nr_v[i]; //si combinatia
- }
- }
- int cerinta3()
- {
- int prim = 1, ultim = p, suma = 0, opmin = 1000000, deunde = -1;
- int i, operatii;
- for (i = prim; i <= ultim; i++)
- suma += Cv[i]; //fac suma primelor p galeti
- while (ultim <= n)
- {
- if (C % suma == 0) //pot umple butoiul complet?
- {
- operatii = C / suma; //facand de atatea ori operatiile
- if (operatii < opmin) //sunt mai putine operatii?
- {
- opmin = operatii; //retine cate si
- deunde = prim; //de unde incepe secventa
- }
- }
- suma -= Cv[prim]; //scad primul element
- prim++;
- ultim++; //treci la secventa urmatoare
- suma += Cv[ultim]; //adaug urmatorul
- }
- return deunde;
- }
- int main()
- {
- int rez;
- fin >> cerinta;
- assert(cerinta >= 1 && cerinta <= 3);
- fin >> C >> n >> k >> p;
- assert(5 <= C && C <= 360000);
- if (cerinta < 3)
- assert(1 <= n && n <= 9);
- else
- assert(3 <= n && n <= 100000);
- assert(1 <= k && k <= 5);
- if (cerinta == 3)
- assert(1 <= p && p <= 10000);
- for (i = 1; i <= n; i++)
- {
- fin >> Cv[i];
- if (cerinta < 3)
- assert(1 <= Cv[i] && Cv[i] <= 8000);
- else
- assert(1 <= Cv[i] && Cv[i] <= 200000);
- }
- if (cerinta == 1 || cerinta == 2)
- {
- while (!nr_v[0]) //exista solutie (enunt)
- {
- rez = calcul(); //cantitatea de apa pentru combinatia curenta
- if (rez == C) //se umple butoiul?
- retine_min(); //retine numarul minim de operatii
- adun_1(); //trec la alta combinatie de galeti
- }
- if (cerinta == 1) //afisari
- fout << sol; //cerinta 1
- else
- for (i = 1; i <= n; i++) //cerinta 2
- fout << nr_v_min[i] << ' ';
- fout << '\n';
- }
- else
- fout << cerinta3() << '\n'; //cerinta 3
- return 0;
- }
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement