1. 程式人生 > 實用技巧 >第十屆山東省ACM省賽復現補題報告

第十屆山東省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;
	}
} 

 DGame 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;
		}
	}
}

  HTokens 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;
	}
}