Advertisement
a53

Butoi

a53
Jun 18th, 2021
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.87 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define N1 10
  3. #define N3 100001
  4. using namespace std;
  5. ifstream fin("butoi.in");
  6. ofstream fout("butoi.out");
  7. int C, V, N, K, P;
  8. int fr[N1], c[N1], minim=1000000;
  9. int sa, s, nr, cnt, sol2[N1], sol3;
  10. int c3[N3];
  11. long long sum, cat, cmin=100000000000;
  12. int main()
  13. {
  14. int i;
  15. fin>>C;
  16. fin>>V>>N>>K>>P;
  17. if(C==1 || C==2)
  18. {
  19. for(i=0; i<N; ++i)
  20. fin>>c[i];
  21. do
  22. {
  23. fr[N-1]++;
  24. s=0;sa=0;nr=0;
  25. for(i=N-1; i>=1; --i)
  26. {
  27. if(fr[i]>K)
  28. {
  29. fr[i]=fr[i]-(K+1);
  30. fr[i-1]=fr[i-1]+1;
  31. }
  32. s+=fr[i];
  33. nr+=fr[i];
  34. sa=sa+(c[i]*fr[i]);
  35. }
  36. s+=fr[0];
  37. nr+=fr[0];
  38. sa=sa+(c[0]*fr[0]);
  39. if(sa==V)
  40. {
  41. cnt++;
  42. if(nr<minim)
  43. {
  44. minim=nr;
  45. for(i=0; i<N; ++i)
  46. sol2[i]=fr[i];
  47. }
  48. }
  49. }
  50. while(s<N*K);
  51. if(C==1)
  52. {
  53. fout<<cnt;
  54. return 0;
  55. }
  56. else
  57. {
  58. for(i=0; i<N; ++i)
  59. fout<<sol2[i]<<" ";
  60. return 0;
  61. }
  62. }
  63. for(i=1; i<=N; ++i)
  64. {
  65. fin>>c3[i];
  66. if(i<=P)
  67. sum+=c3[i];
  68. }
  69. if(V%sum==0)
  70. {
  71. cat=V/sum;
  72. if(cat<cmin)
  73. {
  74. cmin=cat;
  75. sol3=1;
  76. }
  77. }
  78. for(i=P+1; i<=N; ++i)
  79. {
  80. sum=(sum-c3[i-P])+c3[i];
  81. if(V%sum==0)
  82. {
  83. cat=V/sum;
  84. if(cat<cmin)
  85. {
  86. cmin=cat;
  87. sol3=i-P+1;
  88. }
  89. }
  90. }
  91. fout<<sol3;
  92.  
  93. return 0;
  94. }
  95. /**
  96. SO
  97. #include <fstream>
  98. #include <cassert>
  99.  
  100. using namespace std;
  101.  
  102. ifstream fin("butoi.in");
  103. ofstream fout("butoi.out");
  104.  
  105. int C, n, k, p, Cv[200005], i, j, sol, cerinta, Smin = 1000000;
  106. int nr_v[10], nr_v_min[10];
  107.  
  108. int calcul()
  109. {
  110. int i, S = 0; //calculez cantitatea de apa
  111. for (i = 1; i <= n; i++) S += nr_v[i] * Cv[i];
  112. return S;
  113. }
  114.  
  115. void adun_1()
  116. {
  117. //adunare 1 in baza k+1
  118. int i = n; //plec de la sfarsit
  119. while (nr_v[i] == k)//cat timp cifra este k
  120. {
  121. nr_v[i] = 0; //pun 0 in locul ei si
  122. i--; //trec mai departe
  123. }
  124. nr_v[i]++; //ultima cifra (pozitia i) o maresc cu 1
  125. }
  126.  
  127. void retine_min()
  128. {
  129. int i, S = 0;
  130.  
  131. sol++; //mai am o solutie
  132. for (i = 1; i <= n; i++) S += nr_v[i];
  133. if (S < Smin) //am mai putine operatii?
  134. {
  135. Smin = S; //retin numarul minim de operatii
  136. for (i = 1; i <= n; i++) nr_v_min[i] = nr_v[i]; //si combinatia
  137. }
  138. }
  139.  
  140. int cerinta3()
  141. {
  142. int prim = 1, ultim = p, suma = 0, opmin = 1000000, deunde = -1;
  143. int i, operatii;
  144. for (i = prim; i <= ultim; i++)
  145. suma += Cv[i]; //fac suma primelor p galeti
  146. while (ultim <= n)
  147. {
  148. if (C % suma == 0) //pot umple butoiul complet?
  149. {
  150. operatii = C / suma; //facand de atatea ori operatiile
  151. if (operatii < opmin) //sunt mai putine operatii?
  152. {
  153. opmin = operatii; //retine cate si
  154. deunde = prim; //de unde incepe secventa
  155. }
  156. }
  157. suma -= Cv[prim]; //scad primul element
  158. prim++;
  159. ultim++; //treci la secventa urmatoare
  160. suma += Cv[ultim]; //adaug urmatorul
  161. }
  162. return deunde;
  163. }
  164. int main()
  165. {
  166. int rez;
  167. fin >> cerinta;
  168. assert(cerinta >= 1 && cerinta <= 3);
  169. fin >> C >> n >> k >> p;
  170. assert(5 <= C && C <= 360000);
  171. if (cerinta < 3)
  172. assert(1 <= n && n <= 9);
  173. else
  174. assert(3 <= n && n <= 100000);
  175. assert(1 <= k && k <= 5);
  176. if (cerinta == 3)
  177. assert(1 <= p && p <= 10000);
  178. for (i = 1; i <= n; i++)
  179. {
  180. fin >> Cv[i];
  181. if (cerinta < 3)
  182. assert(1 <= Cv[i] && Cv[i] <= 8000);
  183. else
  184. assert(1 <= Cv[i] && Cv[i] <= 200000);
  185. }
  186. if (cerinta == 1 || cerinta == 2)
  187. {
  188. while (!nr_v[0]) //exista solutie (enunt)
  189. {
  190. rez = calcul(); //cantitatea de apa pentru combinatia curenta
  191. if (rez == C) //se umple butoiul?
  192. retine_min(); //retine numarul minim de operatii
  193. adun_1(); //trec la alta combinatie de galeti
  194. }
  195. if (cerinta == 1) //afisari
  196. fout << sol; //cerinta 1
  197. else
  198. for (i = 1; i <= n; i++) //cerinta 2
  199. fout << nr_v_min[i] << ' ';
  200. fout << '\n';
  201. }
  202. else
  203. fout << cerinta3() << '\n'; //cerinta 3
  204. return 0;
  205. }
  206. */
  207.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement