社区讨论

玄关,求条

P14810[CCPC 2024 哈尔滨站] 新能源汽车参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mmbub6v8
此快照首次捕获于
2026/03/04 17:34
6 天前
此快照最后确认于
2026/03/07 11:30
3 天前
查看原帖
不知道怎么错了,求大佬救救me,已经两天了
CPP
#include<iostream>
#include<map>
#include<vector>
using namespace std;
using ll=long long;
const int N=1e5+5;
int T;
ll a[N];
ll x[N],t[N];
vector<int>battery1;
vector<int>battery2;
map<int,ll>dead;
map<int,int>mp;
int main() {
	cin>>T;
	while(T--) {
		battery1.clear();battery2.clear();
		dead.clear();
		mp.clear();
		int n,m;
		cin>>n>>m;
		int id=0,id1=0;
		for(int i=1; i<=n; i++) {
			cin>>a[i];
			dead[i]=a[i];
		}
		for(int i=1; i<=m; i++) {
			cin>>x[i]>>t[i];
			battery1.push_back(t[i]);
			mp[t[i]]++;
		}
		for(int i=1; i<=n; i++) if(!mp[i]) battery2.push_back(i);
		ll candrive=0;
		for(int i=1; i<=m; i++) {
			ll dist=x[i]-x[i-1];
			//cout<<"dist:"<<dist<<endl;
			while(id<battery1.size()) {
				if(mp[battery1[id]]==0){
					id++;continue;
				}
				//cout<<"电池"<<battery1[id]<<"号"<<endl;
				if(dist>=dead[ battery1[ id ] ]) {
					candrive+=dead[ battery1[ id ] ];
					dist-=dead[ battery1[ id ] ];
					dead[ battery1[ id++ ] ]=0;
					if(dist==0) break;
				} else {
					if(mp[battery1[ id ]]==0) battery1.push_back(battery1[ id ]);
					dead[ battery1[ id++ ] ]-=dist;
					candrive+=dist;
					dist=0;
					break;
				}
			}
			if(candrive==x[i]) {
				dead[t[i]]=a[t[i]];
				if(!(--mp[ t[i] ])) battery2.push_back(t[i]);
			} else {
				while(id1<battery2.size()) {
					if(dist>=dead[battery2[id1]]) {
						candrive+=dead[battery2[id1]];
						dist-=dead[battery2[id1]];
						dead[battery2[id1++]]=0;
					} else {
						dead[battery2[id1]]-=dist;
						candrive+=dist;
						dist=0;
						break;
					}
				}
				if(candrive==x[i]){
					dead[t[i]]=a[t[i]];
					if(!(--mp[ t[i] ])) battery2.push_back(t[i]);
				}
				else break;
			}
			//cout<<"candtive:"<<candrive<<endl;
		}
		//cout<<candrive<<endl;
		while(id<battery1.size()) {
			candrive+=dead[battery1[id]];
			dead[battery1[id++]]=0;
		}
		while(id1<battery2.size()) {
			candrive+=dead[battery2[id1]];
			dead[battery2[id1++]]=0;
		}
		cout<<candrive<<endl;
	}
	return 0;
}
思路大体和题解差不多,就是不知道是细节处理有问题,还是哪里写炸了

回复

0 条回复,欢迎继续交流。

正在加载回复...