第十屆山東省ACM省賽復現補題報告
阿新 • • 發佈:2020-10-04
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; } }