第十届山东省ACM省赛复现补题报告

C  Wandering Robot

  

#include<bits/stdc++.h>
using nmaespace std;
int main(){
int p;
		cin>>p;
		for(int i=0;i<n;i++){
			if(p[i]=='R'){
				m++;
			}
			if(p[i]=='L'){
				m--;
			}
			if(p[i]=='U'){
				o++;
			}
			if(p[i]=='D'){
				o--;
			}
			maxn=max(maxn,abs(m)+abs(o));
		}
		m=(k-1)*m;
		o=(k-1)*o;
		for(int i=0;i<n;i++){
			if(p[i]=='R'){
				m++;
			}
			if(p[i]=='L'){
				m--;
			}
			if(p[i]=='U'){
				o++;
			}
			if(p[i]=='D'){
				o--;
			}
			maxn=max(maxn,abs(o)+abs(m));
		}
		cout<<maxn<<endl;
	}
} 

 D  Game on a Graph

题意:由题知,n个点m条线,根据每个人的取线的顺序,问哪一队取出一条线后不能把点连接起来

题解:根据n个点最多要n-1条线,所以只能取m-n+1,超过的就输了。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
struct edge{
	int u;
	int v;
};
int main(){
	int t;
	cin>>t;
	while(t--){
		int k,n,m;
		string p;
		cin>>k;
		cin>>p;
		cin>>n>>m;
		edge a[m+10];
		for(int i=0;i<m;i++){
			cin>>a[i].u>>a[i].v;
		}
		int ans=0;
		if(m>=n-1){
			ans=(m-(n-1))%n;
		} 
		//cout<<ans<<endl;
		if(p[ans]=='1'){
			cout<<2<<endl;
		}
		else{
			cout<<1<<endl;
		}
	}
}

  H  Tokens on the Segments

题意:给出许多个区间,每个区间上的每个点都可以被标记,只要每个区间上有一个点被标记,即可记为这个区间被标记,求最多可以被标记的区间个数。

题解:对于所有的区间我们进行一个排序,(按左边界小的排序;若左边界同,按右边界小的排序),把这些区间放进一个优先队列,每次都标记左边界,用一个maxx进行记录左边界,如果左边界已经被标记了,就判断区间是否为1,不为1的话就可以把左边界右移一位,然后再次将这个改过的区间加入到优先队列中去。(参照大佬题解)

代码:

#include<bits/stdc++.h>
const int maxn=1e7+5;
using namespace std;
struct node{
	int l,r;
	bool operator <(node a)const{
	 if(l==a.l){
	 	return r>a.r;
	 }
	 return l>a.l;
	}
}str[maxn],tt;//先按左边界小开始排序,左边相等就按右边界小排序。排序 
int main(){
	int t;
	cin>>t;
	while(t--){
		priority_queue<node>q;//优先队列 从大到小放入可以重载<进行排序
		int n;
		cin>>n;
		for(int i=0;i<n;i++){
			cin>>str[i].l>>str[i].r;
			q.push(str[i]);
		} 
		int num=0;
		int maxx=0;
		while(!q.empty()){
			tt=q.top();
			q.pop();
			if(tt.l>maxx){
				maxx=tt.l;
				num++;
			}
			else if(tt.l<tt.r){
				tt.l++;
				q.push(tt);
			}
		}
		cout<<num<<endl;
	}
}

  

原文地址:https://www.cnblogs.com/liyongqi/p/13763694.html