题目链接:
http://codeforces.com/contest/747/problem/C
题解:
题目大意:给你n台电脑以及q条命令,每个命令给你ti,ki,di三个数。ti表示这个命令开始的时间,ki表示执行这个命令需要的电脑的台数,di表示执行这个命令需要的时间,如果能够执行,就输出最小的执行的电脑的下标之和,不然就输出-1。
直接暴力维护一个数组,但是需要注意的是,当这个数组没法执行的时候,需要将数组的状态还原到上一步可以执行的时候的状态。
代码:
#include <cmath>
#include <cstdio>
#include <map>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
typedef long long ll;
const ll maxn = 100+10;
ll pos[maxn],pre_pos[maxn];
ll n,q;
int main()
{
cin>>n>>q;
met(pos,0);
met(pre_pos,0);
ll cnt,sum,flag;
for(ll i=1;i<=q;i++)
{
ll a,b,c;
cin>>a>>b>>c;
cnt=sum=flag=0;
for(ll j=1;j<=n;j++)
pre_pos[j]=pos[j];
for(ll j=1;j<=n;j++)
{
if(pos[j]<a)
{
pos[j]=a+c-1;
sum+=j;
cnt++;
}
if(cnt==b)
{
cout<<sum<<endl;
flag=1;
break;
}
}
if(!flag)
{
cout<<-1<<endl;
for(int j=1;j<=n;j++)
pos[j]=pre_pos[j];
}
}
}