Pagini recente » Cod sursa (job #1626129) | Cod sursa (job #2194025) | Cod sursa (job #1897844) | Cod sursa (job #2009016) | Cod sursa (job #954983)
Cod sursa(job #954983)
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("trans.in");
ofstream fout("trans.out");
bool c;
int s,S[16001][2],bst[16001][2]; // S[i][c] = suma ce trebuie platita pentru a converti pietrele de la 1 la i in culorea c; putem obtine astfel suma de convertire in culoarea c a oricarei succesiuni de pietre: suma[i..j][c]= S[j][c] - S[i][c];
int v[16001][2],Q,n,i,k,t; // bst[i][c]= suma minima ce trebuia platita pentru a transporta primele i pietre cand ultimul camion are culoarea c
// Formula de recurenta este bst[i][c] = Min { min( bst[j][0], bst[j][1]) + S[i][c] - S[i][j] +T } pentru i-k <= j <i. (adica o optiune este sa transportam pietrele j..i in acelasi camion cu culoarea c adaugandu-se la costul cel mai bun de a transporta pietrele 1..j. Dintre toate tipurile acestea de optiuni o alegem pe cea mai buna pentru fiecare culoare c
// v[i][c] = elementele ce constituie deque-ul acestei probleme; este termenul min (bst[j][0],bst[j][1]) - S[i][j] din relatia de mai sus, deoarece S[i][c] si T sunt termeni fixci (nu depind de j). Profitam astfel de abilitatea deque-ului de a ne da minimul la fiecare pas pt un interval ce se muta cu cate o unitate.
int minm (int a, int b)
{
if(a<b) return a;
return b;
}
void insert_in_deque (deque <int> &D, int c,int i)
{
v[i][c]=minm (bst[i][0],bst[i][1]) - S[i][c];
while ( !D.empty () && v[i][c] <= v[D.back()][c]) D.pop_back ();
D.push_back (i);
}
void eject_from_deque (deque <int> &D,const int i)
{
if (D.front ()==i) D.pop_front ();
}
int dynamic (const int k,const int t)
{
deque <int> D[2];
for (int i=1; i<=n; i++)
{
insert_in_deque (D[0],0,i-1);
insert_in_deque (D[1],1,i-1);
eject_from_deque (D[0],i-k-1);
eject_from_deque (D[1],i-k-1);
bst[i][0] = v[D[0].front ()][0] + S[i][0] + t;
bst[i][1] = v[D[1].front ()][1] + S[i][1] + t;
}
return minm (bst[n][0],bst[n][1]);
}
int main ()
{
fin>>n;
for (i=1;i<=n;i++)
{
fin>>c>>s;
S[i][c]=S[i-1][c]+s;
S[i][1-c]=S[i-1][1-c];
}
fin>>Q;
for (i=1;i<=Q;i++)
{
fin>>k>>t;
fout<<dynamic (k,t)<<"\n";
}
}