zoukankan      html  css  js  c++  java
  • 2018 Spring Single Training B (uva 572,HihoCoder 1632,POJ 2387,POJ 2236,UVA 10054,HDU 2141)

    这场比赛可以说是灰常的水了,涨信心场??

    今下午义务劳动,去拿着锄头发了将近一小时呆,发现自己实在是干不了什么,就跑到实验室打比赛了~

    之前的比赛补题补了这么久连一场完整的都没补完,结果这场比完后一小时连题解都出来了···

    A-烤肉拌饭 ( uva 572

    就是求联通块的数量啊,刚学dfs的时候做的那种!

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <queue>
     6 
     7 using namespace std;
     8 const int maxn=100+5;
     9 const int dx[]={1,-1,1,-1,1,-1,0,0};
    10 const int dy[]={0,0,1,1,-1,-1,1,-1};
    11 char G[maxn][maxn];
    12 int vis[maxn][maxn];
    13 int n,m;
    14 int ans;
    15 void dfs(int x,int y){
    16     vis[x][y]=1;
    17     for(int i=0;i<8;i++){
    18         int nx=x+dx[i];
    19         int ny=y+dy[i];
    20         if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&G[nx][ny]=='@'&&!vis[nx][ny]){
    21             dfs(nx,ny);
    22         }
    23     }
    24     return ;
    25 }
    26 int main(){
    27     while(scanf("%d%d",&n,&m)&&n&&m){
    28         memset(vis,0,sizeof(vis));
    29         ans=0;
    30         for(int i=1;i<=n;i++){
    31             for(int j=1;j<=m;j++){
    32                 scanf(" %c",&G[i][j]);
    33             }
    34         }
    35         for(int i=1;i<=n;i++){
    36             for(int j=1;j<=m;j++){
    37                 if(!vis[i][j]&&G[i][j]=='@'){
    38                     ans++;
    39                     dfs(i,j);
    40                 }
    41             }
    42         }
    43         cout<<ans<<endl;
    44     }
    45 return 0;
    46 }
    View Code
     
     

    B-麻辣香锅 HihoCoder - 1632

    模拟,emmm模拟可以提高代码能力??

    C-啵啵鱼 poj2387

    是个很裸的最短路,一个spfa或者dijsktra就可以

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <queue>
     6 
     7 using namespace std;
     8 const int maxn=2000+10;
     9 const int maxm=4000+10;
    10 const int INF=2147483600;
    11 typedef long long LL;
    12 int head[maxn],Next[maxm],to[maxm];
    13 LL val[maxm];
    14 int sz;
    15 int n,m;
    16 void add_edge(int a,int b,LL w){
    17     ++sz;
    18     val[sz]=w;
    19     to[sz]=b;
    20     Next[sz]=head[a];
    21     head[a]=sz;
    22 }
    23 LL d[maxn];
    24 int spfa(int s){
    25     for(int i=1;i<=n;i++)d[i]=INF;
    26     int vis[maxn];
    27     memset(vis,0,sizeof(vis));
    28     queue<int>q;
    29     q.push(s);
    30     vis[s]=1;
    31     d[s]=0;
    32     while(!q.empty()){
    33         int u=q.front();q.pop();vis[u]=0;
    34         for(int i=head[u];i;i=Next[i]){
    35             int v=to[i];
    36             if(d[v]>d[u]+val[i]){
    37                 d[v]=d[u]+val[i];
    38                 if(!vis[v]){
    39                     vis[v]=1;
    40                     q.push(v);
    41                 }
    42             }
    43         }
    44     }
    45     return d[1];
    46 }
    47 int main(){
    48     sz=0;
    49     memset(head,0,sizeof(head));
    50     scanf("%d%d",&m,&n);
    51     int a,b;LL c;
    52     for(int i=1;i<=m;i++){
    53         scanf("%d %d%lld",&a,&b,&c);
    54       //  cout<<a<<" "<<b<<" "<<c<<endl;
    55         add_edge(a,b,c);
    56         add_edge(b,a,c);
    57     }
    58     cout<<spfa(n);
    59 return 0;
    60 }
    View Code

    D-海底捞 POJ2236

    卢老师一句话点醒梦中人,直接并查集就可以~

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <cstring>
     5 using namespace std;
     6 const int maxn=1000+10;
     7 int n,d;
     8 int a,b;
     9 char c;
    10 int p[maxn],vis[maxn];
    11 struct Node{
    12     int x,y;
    13 }node[maxn];
    14 int find(int x){
    15     return p[x]==x?x:p[x]=find(p[x]);
    16 }
    17 bool dist(Node A,Node B){
    18     if((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)<=d*d)
    19         return true;
    20     return false;
    21 }
    22 int main(){
    23     scanf("%d%d",&n,&d);
    24     for(int i=1;i<=n;i++){
    25         scanf("%d%d",&node[i].x,&node[i].y);
    26     }
    27     for(int i=0;i<=n;i++)p[i]=i;
    28     while(scanf(" %c",&c)!=EOF){
    29         if(c=='O'){
    30             scanf("%d",&a);
    31             vis[a]=1;
    32             for(int i=1;i<=n;i++){
    33                 if(vis[i]&&i!=a&&dist(node[a],node[i])){
    34                    // cout<<a<<"-->"<<i<<endl;
    35                     int x=find(a),y=find(i);
    36                     if(x!=y)p[x]=y;
    37                 }
    38             }
    39         }
    40         if(c=='S'){
    41             scanf("%d%d",&a,&b);
    42             int x=find(a),y=find(b);
    43             //cout<<":"<<x<<y<<endl;
    44             if(x==y){
    45                 printf("SUCCESS
    ");
    46             }else{
    47                 printf("FAIL
    ");
    48             }
    49         }
    50     }
    51     return 0;
    52 }
    View Code

    E-黄焖鸡 uva10054

    这个题以前做过,欧拉回路,注意打印的时候逆序输出

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <queue>
     6 
     7 using namespace std;
     8 const int maxn=1000+20;
     9 
    10 int T;
    11 int G[maxn][maxn];
    12 int n;
    13 int deg[maxn];
    14 int a,b;
    15 int M;
    16 int p[maxn];
    17 int find(int x){
    18     return p[x]==x?x:find(p[x]);
    19 }
    20 void dfs(int u){
    21     for(int i=1;i<=M;i++){
    22         if(G[u][i]){
    23             G[u][i]--;
    24             G[i][u]--;
    25             dfs(i);
    26             cout<<i<<" "<<u<<endl;
    27         }
    28     }
    29     return;
    30 }
    31 int main(){
    32     scanf("%d",&T);
    33     for(int t=1;t<=T;t++){
    34         if(t!=1)cout<<""<<endl;
    35         memset(G,0,sizeof(G));
    36         memset(deg,0,sizeof(deg));
    37         printf("Case #%d
    ",t);
    38         M=-1;
    39         scanf("%d",&n);
    40         for(int i=1;i<=55;i++)p[i]=i;
    41         for(int i=1;i<=n;i++){
    42             scanf("%d%d",&a,&b);
    43             M=max(M,max(a,b));
    44             G[a][b]++;
    45             G[b][a]++;
    46             deg[a]++;
    47             deg[b]++;
    48             int x=find(a),y=find(b);
    49             if(x!=y)p[x]=y;
    50 
    51         }
    52         bool judge=1;
    53         for(int i=1;i<=M;i++){
    54             if(deg[i]){
    55                 if(find(i)!=find(M)||deg[i]%2){
    56                     judge=0;
    57                     break;
    58                 }
    59             }
    60         }
    61         if(!judge){
    62             cout<<"some beads may be lost"<<endl;
    63         }else{
    64         for(int i=1;i<=M;i++)
    65             dfs(i);
    66         }
    67 
    68     }
    69 return 0;
    70 }
    View Code

    F- 减肥成功指日可待 hdu2141

    用set或者二分。但是set再G++下会MLE必须要选择C++才能AC,雾···

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <set>
     6 #include <vector>
     7 using namespace std;
     8 const int maxn=500+10;
     9 typedef long long LL;
    10 int A,B,C,s,x;
    11 LL a[maxn],b[maxn],c[maxn];
    12 int kase;
    13 int main(){
    14     while(scanf("%d%d%d",&A,&B,&C)!=EOF){
    15     kase++;
    16     set<LL>S;
    17     printf("Case %d:
    ",kase);
    18     for(int i=1;i<=A;i++){
    19         scanf("%lld",&a[i]);
    20     }
    21     for(int i=1;i<=B;i++){
    22         scanf("%lld",&b[i]);
    23     }
    24     for(int i=1;i<=C;i++){
    25         scanf("%lld",&c[i]);
    26     }
    27     for(int i=1;i<=A;i++){
    28         for(int j=1;j<=B;j++){
    29             //for(int l=1;l<=C;l++){
    30                 LL X=a[i]+b[j];
    31                 if(!S.count(X))
    32                     S.insert(X);
    33            // }
    34         }
    35     }
    36     scanf("%d",&s);
    37     LL x;
    38     for(int i=1;i<=s;i++){
    39         scanf("%lld",&x);
    40         bool ok=0;
    41         for(int i=1;i<=C;i++){
    42             LL pos=x-c[i];
    43             //if(pos<0)continue;
    44             if(S.count(pos)){
    45                 ok=1;
    46                 break;
    47             }
    48         }
    49         //if(S.count(x))cout<<"YES"<<endl;
    50         if(ok)cout<<"YES"<<endl;
    51         else
    52             cout<<"NO"<<endl;
    53     }
    54     }
    55 return 0;
    56 }
    View Code
  • 相关阅读:
    关于我这个bilibili主题的炫酷博客园css
    WSL(Windows Subsystem for Linux)的安装与使用【OI选手的不二选择】
    JSOI2019 round2 游记
    JSOI2019&12省联考退役记
    Thuwc 2019&Noi WC 2019 游记
    CF284A Cows and Primitive Roots
    CF261B Maxim and Restaurant
    洛谷P5840 [COCI2015]Divljak
    CF1295E Permutation Separation
    CF1295A Display The Number
  • 原文地址:https://www.cnblogs.com/LQLlulu/p/8810035.html
Copyright © 2011-2022 走看看