第十届山东省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; } }