第一题是负载均衡。因为它的时间ai+1一定大于ai,所以只需拿后面的时间与前面时间加上运行时间进行比较即可。我们采用大根堆,让时间最大的位于top位置,然后一个一个比较下来。
看代码
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
ll powe[N];
struct node
{
ll time, powj;
friend bool operator<(node x, node y)
{
return x.time > y.time;
}
};
priority_queue<node>q[N];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> powe[i];
}
for (int i = 1; i <= m; i++)
{
ll a, b, c, d;
cin >> a >> b >> c >> d;
while (!q[b].empty())
{
if (q[b].top().time < a)
{
powe[b] += q[b].top().powj;
q[b].pop();
}
else
{
break;
}
}
if (powe[b] < d)
{
cout << -1 << '\n';
}
else
{
powe[b] -= d;
q[b].push(node{ a + c, d });
cout << powe[b] << '\n';
}
}
return 0;
}
然后是接龙数列,利用dp,dp[a.last]=max(dp[a.last],dp[a.first]+1),用这个式子就可以很快算出结果,上代码
#include<iostream>
using namespace std;
string s;
int dp[10];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> s;
dp[s[s.length() - 1] - '0'] = max(dp[s[s.length() - 1] - '0'], dp[s[0] - '0']+1);
}
int maxn = 0;
for (int i = 0; i <= 9; i++)
{
maxn =max(maxn, dp[i]);
}
cout << n - maxn << endl;
return 0;
}
第三道则是一道博弈论问题,另一个游戏。只要v[1]不是1,那么先手必胜,因为每次先手都可以拿到只剩一个为止,而如果n=2,那么先手也是直接获胜。如果v[1]=1并且n>2,后手胜。上码
#include<iostream>
using namespace std;
const int N = 1e3 + 5;
int main()
{
int n;
cin >> n;
int v[N] = { 0 };
for (int i = 1; i <= n; i++)
{
cin >> v[i];
}
if (n == 2)
{
cout << "Charlie";
}
else if (v[1] == 1)
{
cout << "Dan";
}
else
{
cout << "Charlie";
}
return 0;
}