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

浙公网安备 33010602011771号