链接1:(8条未读私信) 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
题目c,给你一个空数组,让你执行t次操作。
在每一次操作中给你一个数组k,v。然后你删除k个数在把v放入数组最后面并求得现在时刻的后缀和。
#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define ll long long
vector<int> a;
ll b[500001];//记录前i数字的后缀和
int main(){
int T;cin >> T;
while(T--){
int t,v;cin >> t >> v;
a.erase(a.end()-t,a.end());//删除数组最后t位
ll sizes = a.size()+1;//得到插入数据后的数组大小
a.push_back(v*sizes);//往a数组里面放入数据
b[sizes] = b[sizes-1]%mod + v*sizes%mod;//通过与之前没有变的数据相加得到后缀和
cout << b[sizes]%mod <<endl;
}
return 0;
}
本题我们通过后缀和的公式即可得到,对于n个数,我们取得它与之前的数字的个数 * 该数字相乘 的和就是这n个数的后缀和,比如
1,2,3的后缀和是14,我们可以通过1*1+2*2+3*3得到,对于3,2,1也是同理为1*3+2*2+3*1 = 10。因此本题我们只需要删除t个数后,再插入v的时候通过之前的记录数组b算出现在的结果就可以了。
b数组记录包含几个数的后缀和。
题目H。
该题目我们作为一名参赛队伍要去选择参加比赛来获取最好的排名,现在有两场比赛可以选择
两场比赛有各种队伍参加,现在给出两场比赛的队伍名字,ac数目,得分,同一只队伍可能出现在两场比赛中,即它参加比赛会获得的得分。假如你可以调整所有的队伍让它们参加不同的比赛,那么你获得的最好排名是多少。
#include<bits/stdc++.h>
using namespace std;
struct yr{
string name;
int pm,score;
}m1[100001],m2[100001];
bool cmp(yr a,yr b){
if(a.pm == b.pm) return a.score < b.score;
return a.pm > b.pm;
}
int main(){
int n,m;
cin >> n;
map<string,int> mp;
for(int i=0;i<n;i++){
cin >> m1[i].name >>m1[i].pm >> m1[i].score;
mp[m1[i].name] = 1;
}sort(m1,m1+n,cmp);
// for(int i=0;i<n;i++) cout << m1[i].name <<" "<< m1[i].pm <<" "<< m1[i].score << endl;
cin >> m;
for(int i=0;i<m;i++){
cin >> m2[i].name >>m2[i].pm >> m2[i].score;
if(mp.count(m2[i].name)) mp[m2[i].name]++;
else mp[m2[i].name]=1;
}sort(m2,m2+m,cmp);
// for(int i=0;i<m;i++) cout << m2[i].name <<" "<< m2[i].pm <<" "<< m2[i].score << endl;
//每队选择最高排名
int mid1=0,mid2=0;
for(int i=0;i<n;i++){
if(m1[i].name=="lzr010506") break;
else{
if(mp[m1[i].name]==2) continue;
else mid1++;
}
}
for(int i=0;i<m;i++){
if(m2[i].name=="lzr010506") break;
else{
if(mp[m2[i].name]==2) continue;
else mid2++;
}
}
// cout << mid1 <<" " << mid2 << endl;
if(mid2 < mid1) cout << mid2+1 << endl;//因为初始化为的0,所以排名+1
else cout << mid1+1 << endl;
return 0;
}
思路:我们先通过ACM赛制的规则进行对它们排序(即先看ac数量,再看罚时)
通过cmp排序后,我们要求我们参加比赛的最佳排名,那么我们就要判断出哪些队伍在两场比赛都出现了,都出现了我们就可以把它放到另外一场我们没有参加的比赛,
这样对于我们参加的比赛来说,我们就可以去掉比我们高的队伍,即去除有两场比赛参赛资格且比我们强的队伍,把它安排到另外一场我们没有参加的比赛,最后得到我们的最高排名。