2024牛客暑假多校训练1

链接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排序后,我们要求我们参加比赛的最佳排名,那么我们就要判断出哪些队伍在两场比赛都出现了,都出现了我们就可以把它放到另外一场我们没有参加的比赛,
这样对于我们参加的比赛来说,我们就可以去掉比我们高的队伍,即去除有两场比赛参赛资格且比我们强的队伍,把它安排到另外一场我们没有参加的比赛,最后得到我们的最高排名。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

years_GG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值