1. 程式人生 > >洛谷七月月賽

洛谷七月月賽

bfs scanf col sca 貪心 排序 ont pre open

A題

分析:直接貪心即可,註意要long long

技術分享
 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 using namespace std;
 6 const int maxn=1e5+10;
 7 long long a[maxn],x;
 8 int n;
 9 int main()
10 {
11     cin>>n>>x;
12     for(int i=0;i<n;i++)
13     scanf("%lld",&a[i]);
14 long long ans=0; 15 for(int i=1;i<n;i++){ 16 if(a[i]+a[i-1]>x){ 17 long long num=a[i]+a[i-1]-x; 18 if(a[i]>=num){ 19 a[i]-=num; 20 ans+=num; 21 }else{ 22 long long tt=num-a[i]; 23 a[i-1
]-=tt; 24 a[i]=0; 25 ans+=num; 26 } 27 } 28 } 29 cout<<ans<<endl; 30 return 0; 31 }
View Code

B題

分析:直接BFS即可,註意因為這個地方有跳變的情況,但是只能跳變一次,所以我們設置兩個狀態,移動過去的標記為0,跳變過去的標記為1

技術分享
 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring
" 4 #include "queue" 5 using namespace std; 6 const int maxn=1100; 7 int vis[maxn][maxn][2]; 8 int h,w,d,r; 9 char s[maxn][maxn]; 10 int dx[]={1,-1,0,0}; 11 int dy[]={0,0,1,-1}; 12 struct Node{ 13 int x,y,flag,step; 14 }; 15 int bfs(){ 16 Node t; 17 t.x=1,t.y=1,t.flag=0,t.step=0; 18 queue<Node>p; 19 vis[t.x][t.y][t.flag]=1; 20 p.push(t); 21 while(!p.empty()){ 22 Node e,f; 23 e=p.front(); p.pop(); 24 if((vis[e.x][e.y][0]||vis[e.x][e.y][1])&&(e.x==h&&e.y==w)) 25 return e.step; 26 for(int i=0;i<4;i++){ 27 int x=e.x+dx[i],y=e.y+dy[i]; 28 if(x<=0||x>h||y<=0||y>w) continue; 29 if(s[x][y]==#||vis[x][y][e.flag]) continue; 30 vis[x][y][e.flag]=1; 31 f.x=x,f.y=y,f.flag=e.flag,f.step=e.step+1; 32 p.push(f); 33 } 34 if(e.flag==0){ 35 int xx=e.x+d,yy=e.y+r; 36 if(xx<=0||xx>h||yy<=0||yy>w) continue; 37 if(s[xx][yy]==#||vis[xx][yy][1]) continue; 38 vis[xx][yy][1]=1; 39 f.x=xx,f.y=yy,f.flag=1,f.step=e.step+1; 40 p.push(f); 41 } 42 } 43 return -1; 44 } 45 int main() 46 { 47 cin>>h>>w>>d>>r; 48 getchar(); 49 for(int i=1;i<=h;i++){ 50 for(int j=1;j<=w;j++) 51 scanf("%c",&s[i][j]); 52 getchar(); 53 } 54 memset(vis,0,sizeof(vis)); 55 cout<<bfs()<<endl; 56 }
View Code

C題

分析:這個題比較考驗開腦洞的能力,首先我們要先按照住宿從前往後排序,其次這個公交站必須建在有住宿的點上,然後我們在腦補一下每次移動有多少人會+1,多少人會-1,則我們可以得到最終建在正好占總人數1/2的那個住宿處

技術分享
 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "algorithm"
 6 using namespace std;
 7 const int maxn=1e5+10;
 8 long long L;
 9 int n;
10 typedef pair<long long,long long> Node;
11 Node p[maxn];
12 int main()
13 {
14     cin>>L>>n;
15     cout<<(2>>1)<<endl; 
16     for(int i=1;i<=n;i++)
17     cin>>p[i].first>>p[i].second;
18     sort(p+1,p+1+n);
19     long long s=0;
20     for(int i=1;i<=n;i++)
21     s+=p[i].second;
22     s=(s+1)>>1;
23     long long o=0,l=0;
24     int b=0;
25     for(int i=1;i<=n;i++){
26         o+=p[i].second;
27         if(!b&&o>=s) b=1,l=p[i].first;
28     }
29     long long ans=0;
30     for(int i=1;i<=n;i++){
31         if(p[i].first<l) ans+=(l-p[i].first)*(p[i].second);
32         else ans-=(l-p[i].first)*(p[i].second);
33     }
34     cout<<ans<<endl;
35 } 
View Code

洛谷七月月賽