目录
CodeForces - 978E E - Bus Video System
CodeForces - 978F F - Mentors
CodeForces - 978G G - Petya's Exams
CodeForces - 978E E - Bus Video System
题意:在每个公交站台记录,车辆走时人数y - 车辆来时人数x。有n个公交站台,公交车得容量为w,给出每个站台得记录b[i]。问公交车出发时的人数可能的情况有?(如果没有这样的情况输出0)
思路:假设初始出发时人数为x。x+最大的上来人数<=w;x-最多的下去人数>=0.
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN = 1e6+10;
const ll INF = 0x3f3f3f3f;
ll b[MAXN];
int main(){
int n,w,a;
cin>>n>>w>>b[0];
ll max_z=0,max_f=0;
if(b[0]<0) max_f = max(abs(b[0]),max_f);
else max_z = max(abs(b[0]),max_z);
for(int i=1;i<n;i++){
cin>>a;
b[i]+=b[i-1]+a;
if(b[i]<0) max_f = max(abs(b[i]),max_f);
else max_z = max(abs(b[i]),max_z);
}
if(max_f>w-max_z) cout<<0<<endl;
else cout<<w-max_z-max_f+1<<endl;
}
CodeForces - 978F F - Mentors
题意:x和y都有技能点,x>y的技能,则x可以做y的导师,但是如果x,y在吵架,他们就不能为导师关系。
思路:给技能点排序,计算比第i个人小的人数,由于有技能点相同的人,所以用二分找一下。然后在输入吵架关系的时候,如果有小于的关系给那个人的人数-1.
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN = 2*1e5+10;
struct node {
int id;
int val;
}b[MAXN],num[MAXN];
bool cmp(node x,node y){
return x.val>y.val;
}
bool cmp1(node x,node y){
return x.id<y.id;
}
int main(){
int n,k,x,y;
cin>>n>>k;
for(int i=0;i<n;i++) cin>>b[i].val,b[i].id=i;
sort(b,b+n,cmp);
for(int i=0;i<n;i++) {
int l=i,r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(b[mid].val<b[i].val) r=mid-1;
else l=mid+1;
}
num[i].val=n-l;
num[i].id=b[i].id;
}
sort(num,num+n,cmp1);
sort(b,b+n,cmp1);
while(k--){
cin>>x>>y;
if(b[x-1].val>b[y-1].val) num[x-1].val-=1;
else if(b[x-1].val<b[y-1].val) num[y-1].val-=1;
}
for(int i=0;i<n;i++) cout<<num[i].val<<" ";
cout<<endl;
}
CodeForces - 978G G - Petya's Exams
题意:一共有n天,m场考试。每场考试有三个属性:考题发布日,考试日,需要准备的时长;对于petya每一天有三个活动(只能选择其中一个):考试,休息,学习。(注意考题发布日当天可以用于准备学习)。
思路:设置一个优先队列,考试日从小到大排序。用一个vector记录当天发布考题的考试。遍历天数,记录每一天干啥,当天vector>0,将考试放入优先队列,然后当天有考试则跳过,然后选择队列top学习,学习完就不放入队列了。若排不开优先队列不为0
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN = 2*1e5+10;
struct node {
int id;
int s,d,c;
bool operator <(const node &u)const{
return d>u.d;
}
};
int days[100+10];
vector<node> s[100+10];
priority_queue<node> q;
int main(){
int n,m;
node exam;
cin>>n>>m;
memset(days,-1,sizeof(days));
for(int i=0;i<m;i++){
cin>>exam.s>>exam.d>>exam.c;
exam.id = i+1;
s[exam.s].push_back(exam);//第i天有考试
days[exam.d] = m+1;//考试日
}
int flag = 0;
for(int i=1;i<=n;i++){
int len = s[i].size();
if(len>0) {
for(int j=0;j<len;j++) q.push(s[i][j]);
}
if(days[i]==m+1) continue;
if(q.size()==0) {
days[i]=0;continue;
} //rest
node tmp = q.top();q.pop();
if(tmp.d<i) {
flag=1;break;
}
days[i] = tmp.id;
tmp.c -= 1;
if(tmp.c>0) q.push(tmp);
}
if(q.size()!=0) flag=1;
if(flag) cout<<-1<<endl;
else{
for(int i=1;i<=n;i++) cout<<days[i]<<" ";
cout<<endl;
}
}