第一题:通关游戏,有俩游戏,每个游戏都有不同关卡,完成第i个关卡才能进行下一个关卡,每个关卡有时间,求在给定时间t下最多完成多少关卡。
题解:典型前缀和题,直接A
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n, m, t;
while(cin>>n>>m>>t)
{
vector<ll> game1(n + 1, 0);
vector<ll> game2(m + 1, 0);
ll index1, index2, res = 0;
for (ll i = 1, num; i <= n; ++i)
{
cin>>num;
game1[i] = game1[i - 1] + num;
if (game1[i] <= t) index1 = i;
}
for (ll i = 1, num; i <= m; ++i)
{
cin>>num;
game2[i] = game2[i - 1] + num;
if (game2[i] <= t) index2 = i;
}
for (ll i = index1; i >=0; --i)
{
for (ll j = index2; j >=0; --j)
{
if (game1[i] + game2[j] <= t)
{
res = max(res, i + j);
break;
}
}
}
cout<<res<<endl;
}
return 0;
}
第二题:小明和小红对士兵的战斗力数组num的前k个士兵,分别进行升序和降序,
经过m次操作后,问最终的士兵战斗力数组是啥样的
题解:排序题,因为越大的k越能影响最后的数组,对k进行从大到小排序,同时也要对index排序,因为可能有相同的K,如果有相同的K,则最后操作的index才是有效的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool cmp(pair<ll, ll> a, pair<ll, ll> b)
{
return a.first > b.first || (a.first == b.first && a.second > b.second);
}
bool cmp_sb(int a, int b)
{
return a > b;
}
int main()
{
ll n,m;
while(cin>>n>>m)
{
vector<ll> sb(n, 0);
for (int i = 0; i < n; ++i) cin>>sb[i];
vector<ll> t(m, 0);
vector<pair<ll, ll>> k;
for (int i = 0, knum; i < m; ++i)
{
cin>>t[i]>>knum;
k.push_back({knum, i});
}
sort(k.begin(), k.end(), cmp);
int tmp_index(-1);
for (const auto & v : k)
{
if (v.second > tmp_index)
{
tmp_index = v.second;
if (t[tmp_index] % 2) sort(sb.begin(), sb.begin() + v.first);
else sort(sb.begin(), sb.begin() + v.first, cmp_sb);
}
}
for (int i = 0; i < n; ++i) cout<<sb[i]<<" ";
cout<<endl;
}
return 0;
}
#百度笔试##秋招##百度##百度23秋招笔试编程题有点儿简单啊#