• 第二届太原理工大学程序设计新生赛决赛(重现赛)


    第二届太原理工大学程序设计新生赛决赛(重现赛)

    A Reversi

    翻转棋,如果两边棋子都是白色,黑子无论动或者不动,下一场白子将全部翻成白。而如果有一个边是黑子,黑子一次就可以全翻黑。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <set>
     6 #include <queue>
     7 #include <stack>
     8 #include <string>
     9 #include <cstring>
    10 #include <vector>
    11 #include <map>
    12 #include<ctime>
    13 #include <unordered_map>
    14 #define mem( a ,x ) memset( a , x ,sizeof(a) )
    15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ )
    16 #define lson  l ,mid ,pos<<1
    17 #define rson mid+1 ,r ,pos<<1|1
    18 using namespace std;
    19 typedef long long ll ;
    20 typedef pair<int ,int> pii;
    21 typedef pair<ll ,int> pli;
    22 const ll inf = 0x3f3f3f3f;
    23 const ll mod=1e9+7;
    24 const int N=100000+50;
    25 int n;
    26 char s[10*N];
    27 int main()
    28 {
    29     scanf("%d",&n);
    30     scanf("%s",s+1);
    31     if(s[1]=='1'||s[n]=='1')
    32         puts("Qiy win");
    33     else    puts("Vanis win");
    34 
    35 
    36     return 0;
    37 }
    View Code
    C Nitori and Stack-Tech

    模拟栈

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <set>
     6 #include <queue>
     7 #include <stack>
     8 #include <string>
     9 #include <cstring>
    10 #include <vector>
    11 #include <map>
    12 #include<ctime>
    13 #include <unordered_map>
    14 #define mem( a ,x ) memset( a , x ,sizeof(a) )
    15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ )
    16 #define lson  l ,mid ,pos<<1
    17 #define rson mid+1 ,r ,pos<<1|1
    18 using namespace std;
    19 typedef long long ll ;
    20 typedef pair<int ,int> pii;
    21 typedef pair<ll ,int> pli;
    22 const ll inf = 0x3f3f3f3f;
    23 const ll mod=1e9+7;
    24 const int N=100000+50;
    25 int n,len=0;
    26 char s[30],t[30],st[30];
    27 int main()
    28 {
    29     scanf("%d",&n);
    30     scanf("%s%s",s+1,t+1);
    31     int c1=0,c2=1;
    32     for(int i=1;i<=n;i++)
    33     {
    34         while(len>0&&st[len]==t[c2])
    35         {
    36             len--;
    37             c2++;
    38         }
    39         st[++len]=s[i];
    40     }
    41     while(len>0&&st[len]==t[c2])
    42         {
    43             len--;
    44             c2++;
    45         }
    46     if(len==0&&c2==n+1)
    47         puts("Yes");
    48     else    puts("No");
    49     
    50 
    51     return 0;
    52 }
    View Code
    D Triangle

    递归一下,然后把所有没有赋值的赋值为.

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <set>
     6 #include <queue>
     7 #include <stack>
     8 #include <string>
     9 #include <cstring>
    10 #include <vector>
    11 #include <map>
    12 #include<ctime>
    13 #include <unordered_map>
    14 #define mem( a ,x ) memset( a , x ,sizeof(a) )
    15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ )
    16 #define lson  l ,mid ,pos<<1
    17 #define rson mid+1 ,r ,pos<<1|1
    18 using namespace std;
    19 typedef long long ll ;
    20 typedef pair<int ,int> pii;
    21 typedef pair<ll ,int> pli;
    22 const int inf = 0x3f3f3f3f;
    23 const ll mod=1e9+7;
    24 const int N=100000+50;
    25 int n;
    26 char s[3100][2100];
    27 void put(int h,int w)
    28 {
    29     int cnt=w;
    30     for(int i=h;i>=1;i--)
    31     {
    32         for(int j=cnt;j>=1;j--)
    33             if(!s[i][j])
    34                 s[i][j]='.';
    35         cnt--;
    36     }
    37     for(int i=1;i<=h;i++)
    38     {
    39         cnt++;
    40         for(int j=1;j<=cnt;j++)
    41             printf("%c",s[i][j]);
    42         printf("
    ");
    43     }
    44 }
    45 void print(int x,int y)
    46 {
    47     s[x][y]='/';
    48     s[x][y+1]=s[x][y+2]='_';
    49     s[x][y+3]=92;
    50     s[x-1][y+1]='/';
    51     s[x-1][y+2]=92;
    52 }
    53 void solve(int n,int x,int y)
    54 {
    55     if(n==1)
    56     {
    57         print(x,y);
    58         return;
    59     }
    60     int cnt=1<<(n-1);
    61     int k=1<<n;
    62     //cout<<n<<" "<<cnt<<" "<<k<<endl;
    63     solve(n-1,x,y);
    64     solve(n-1,x,y+k);
    65     solve(n-1,x-cnt,y+cnt);
    66 }
    67 int main()
    68 {
    69     scanf("%d",&n);
    70     int h=1<<n,w=1<<(n+1);
    71     //cout<<h<<" "<<w<<endl;
    72     solve(n,h,1);
    73     put(h,w);
    74 
    75 
    76     return 0;
    77 }
    View Code
    E Sweet

    有糖,感觉是一个exgcd的题。不知道为啥没人这样写...

    找到第一个有糖的人,然后剩下的就是每隔lcm就是一个有糖的人。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <set>
     6 #include <queue>
     7 #include <stack>
     8 #include <string>
     9 #include <cstring>
    10 #include <vector>
    11 #include <map>
    12 #include<ctime>
    13 #include <unordered_map>
    14 #define mem( a ,x ) memset( a , x ,sizeof(a) )
    15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ )
    16 #define lson  l ,mid ,pos<<1
    17 #define rson mid+1 ,r ,pos<<1|1
    18 using namespace std;
    19 typedef long long ll ;
    20 typedef pair<int ,int> pii;
    21 typedef pair<ll ,int> pli;
    22 const int inf = 0x3f3f3f3f;
    23 const ll mod=1e9+7;
    24 const int N=100000+50;
    25 ll n,a,b,gcdd,x,y;
    26 ll gcd(ll a,ll b)   {return b==0?a:gcd(b,a%b);}
    27 ll lcm(ll a,ll b)   {return a/gcd(a,b)*b;}
    28 int main()
    29 {
    30     scanf("%lld%lld%lld",&n,&a,&b);
    31     ll lc=lcm(a,b);
    32     ll st=n+1;
    33     for(ll i=n%b+1;i<=n;i+=b)
    34     {
    35         if(i%a==0)
    36         {
    37             st=i;   break;
    38         }
    39     }
    40     if(st>n)    {printf("0
    "); return 0;}
    41     ll ans=(n-st)/lc+1;
    42     printf("%lld
    ",ans);
    43 
    44 
    45 
    46     return 0;
    47 }
    View Code
    G Gangstar

    在一棵树上,1号点上的人在追赶x号点的人。

    对于一个节点来说,如果1号点到达这个节点的时间>x号点到达这个节点的时间,x就可以到达这个节点的最深处,等待着1号点的抓捕。

    重点是怎么求时间,也就是距离。用到了lca。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cmath>
      4 #include <algorithm>
      5 #include <set>
      6 #include <queue>
      7 #include <stack>
      8 #include <string>
      9 #include <cstring>
     10 #include <vector>
     11 #include <map>
     12 #include<ctime>
     13 #include <unordered_map>
     14 #define mem( a ,x ) memset( a , x ,sizeof(a) )
     15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ )
     16 #define lson  l ,mid ,pos<<1
     17 #define rson mid+1 ,r ,pos<<1|1
     18 using namespace std;
     19 typedef long long ll ;
     20 typedef pair<int ,int> pii;
     21 typedef pair<ll ,int> pli;
     22 const int inf = 0x3f3f3f3f;
     23 const ll mod=1e9+7;
     24 const int N=100000+50;
     25 int n,xx,yy,st;
     26 int Link[2*N],len=0;
     27 int f[2*N][22],dep[2*N],dp[2*N];
     28 int ans=0;
     29 struct node
     30 {
     31     int y,next;
     32 }e[4*N];
     33 void insert(int xx,int yy)
     34 {
     35     e[++len].next=Link[xx];
     36     Link[xx]=len;
     37     e[len].y=yy;
     38 }
     39 void dfs(int x,int fa)
     40 {
     41     dep[x]=dep[fa]+1;
     42     for(int i=1;(1<<i)<=dep[x];i++)
     43         f[x][i]=f[f[x][i-1]][i-1];
     44     for(int i=Link[x];i;i=e[i].next)
     45     {
     46         int v=e[i].y;
     47         if(v==fa)   continue;
     48         f[v][0]=x;
     49         dfs(v,x);
     50         dp[x]=max(dp[x],dp[v]+1);
     51     }
     52 }
     53 int lca(int x,int y)
     54 {
     55     if(dep[x]<dep[y])   swap(x,y);
     56     for(int i=20;i>=0;i--)
     57     {
     58         if(dep[f[x][i]]>=dep[y])    x=f[x][i];
     59         if(x==y)    return x;
     60     }
     61     for(int i=20;i>=0;i--)
     62     {
     63         if(f[x][i]!=f[y][i])
     64         {
     65             x=f[x][i];
     66             y=f[y][i];
     67         }
     68     }
     69     return f[x][0];
     70 }
     71 int dis(int x,int y)
     72 {
     73     return dep[x]+dep[y]-2*dep[lca(x,y)];
     74 }
     75 void dfs1(int u,int fa)
     76 {
     77     int dis1=dis(u,1),dis2=dis(u,st);
     78     if(dis1>dis2)
     79     {
     80         int ma=2*dp[u]+2*dis1;
     81         ans=max(ans,ma);
     82     }
     83     for(int i=Link[u];i;i=e[i].next)
     84     {
     85         int v=e[i].y;
     86         if(v==fa)   continue;
     87         dfs1(v,u);
     88     }
     89 }
     90 int main()
     91 {
     92     scanf("%d%d",&n,&st);
     93     for(int i=1;i<n;i++)
     94     {
     95         scanf("%d%d",&xx,&yy);
     96         insert(xx,yy);
     97         insert(yy,xx);
     98     }
     99     dfs(1,0);
    100     dfs1(1,0);
    101     printf("%d
    ",ans);
    102 
    103     return 0;
    104 }
    View Code
    H Stable Fusion

    1号节点是根,刚开始觉得1号节点可以随便设置,然后它下面的节点都必须满足 min(a[i],a[fa]);

    然后就过不去了。

    1号节点可以随便设置,1号节点下面的节点,只要不超过1号节点的值,也可以随便设置。而不是非要用ai这个值。

    然后就是dp了。

    我们把下面的节点所有都求出来。

    f[fa][j]+=f[v][j];

    最后求最小的f[1][x]就好了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <set>
     6 #include <queue>
     7 #include <stack>
     8 #include <string>
     9 #include <cstring>
    10 #include <vector>
    11 #include <map>
    12 #include<ctime>
    13 #include <unordered_map>
    14 #define mem( a ,x ) memset( a , x ,sizeof(a) )
    15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ )
    16 #define lson  l ,mid ,pos<<1
    17 #define rson mid+1 ,r ,pos<<1|1
    18 using namespace std;
    19 typedef long long ll ;
    20 typedef pair<int ,int> pii;
    21 typedef pair<ll ,int> pli;
    22 const int inf = 0x3f3f3f3f;
    23 const ll mod=1e9+7;
    24 const int N=100000+50;
    25 int n,xx,yy;
    26 int Link[1010],len=0;
    27 int ans=0;
    28 ll a[1010],f[1010][1010];
    29 struct node
    30 {
    31     int y,next;
    32 }e[2020];
    33 void insert(int xx,int yy)
    34 {
    35     e[++len].next=Link[xx];
    36     Link[xx]=len;
    37     e[len].y=yy;
    38 }
    39 void dfs(int x,int fa)
    40 {
    41     for(int j=0;j<=1000;j++)    f[x][j]=abs(a[x]-j);
    42     for(int i=Link[x];i;i=e[i].next)
    43     {
    44         int v=e[i].y;
    45         if(v==fa)   continue;
    46         dfs(v,x);
    47         ll minn=inf;
    48         for(int j=0;j<=1000;j++)
    49         {
    50             minn=min(minn,f[v][j]);
    51             f[x][j]+=minn;
    52         }
    53     }
    54 }
    55 int main()
    56 {
    57     scanf("%d",&n);
    58     for(int i=2;i<=n;i++)
    59     {
    60         scanf("%d",&xx);
    61         insert(i,xx);
    62         insert(xx,i);
    63     }
    64     for(int i=1;i<=n;i++)
    65     {
    66         scanf("%lld",&a[i]);
    67     }
    68     for(int i=1;i<=n;i++)
    69         for(int j=0;j<=1000;j++)
    70             f[i][j]=inf;
    71     dfs(1,0);
    72     ll ans=inf;
    73     for(int i=0;i<=1000;i++)
    74         ans=min(ans,f[1][i]);
    75     printf("%lld
    ",ans);
    76 
    77 
    78     return 0;
    79 }
    View Code
    I The Flower of Hope

    满足条件的区间为:区间和k%m<k/2

    当k>=m,就可以达到这个条件。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <set>
     6 #include <queue>
     7 #include <stack>
     8 #include <string>
     9 #include <cstring>
    10 #include <vector>
    11 #include <map>
    12 #include<ctime>
    13 #include <unordered_map>
    14 #define mem( a ,x ) memset( a , x ,sizeof(a) )
    15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ )
    16 #define lson  l ,mid ,pos<<1
    17 #define rson mid+1 ,r ,pos<<1|1
    18 using namespace std;
    19 typedef long long ll ;
    20 typedef pair<int ,int> pii;
    21 typedef pair<ll ,int> pli;
    22 const int inf = 0x3f3f3f3f;
    23 const ll mod=1e9+7;
    24 const int N=100000+50;
    25 int n,m;
    26 int a[N];
    27 ll sum[N];
    28 ll ans=0;
    29 int check(int x,int k)
    30 {
    31     if(sum[x]-sum[k-1]>=m)  return 1;
    32     return 0;
    33 }
    34 int main()
    35 {
    36     scanf("%d%d",&n,&m);
    37     for(int i=1;i<=n;i++)
    38     {
    39         scanf("%d",&a[i]);
    40         sum[i]=sum[i-1]+a[i];
    41     }
    42     for(int i=1;i<=n;i++)
    43     {
    44         int l=i,r=n;
    45         while(l<=r)
    46         {
    47             int mid=l+r>>1;
    48             if(check(mid,i))  r=mid-1;
    49             else    l=mid+1;
    50         }
    51         ans+=n-l+1;
    52     }
    53     printf("%lld
    ",ans);
    54 
    55     return 0;
    56 }
    View Code
    J Fuse the Cube Fragment

    找最多的不能整除的数。

    答案为 n/2,从n/2开始,一直到n。

    要找两种就是 把所有偶数都除/2,也算一种。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <set>
     6 #include <queue>
     7 #include <stack>
     8 #include <string>
     9 #include <cstring>
    10 #include <vector>
    11 #include <map>
    12 #include<ctime>
    13 #include <unordered_map>
    14 #define mem( a ,x ) memset( a , x ,sizeof(a) )
    15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ )
    16 #define lson  l ,mid ,pos<<1
    17 #define rson mid+1 ,r ,pos<<1|1
    18 using namespace std;
    19 typedef long long ll ;
    20 typedef pair<int ,int> pii;
    21 typedef pair<ll ,int> pli;
    22 const ll inf = 0x3f3f3f3f;
    23 const ll mod=1e9+7;
    24 const int N=100000+50;
    25 int n;
    26 int prime[N],p[N],tot;
    27 void init(int n)
    28 {
    29     for(int i=2;i<=n;i++)    prime[i]=1;
    30     for(int i=2;i<=n;i++)
    31     {
    32         if(prime[i]==1) p[++tot]=i;
    33         for(int j=1;j<=tot&&i*p[j]<=n;j++)
    34         {
    35             prime[i*p[j]]=0;
    36             if(i%p[j]==0)   break;
    37         }
    38     }
    39 }
    40 int main()
    41 {
    42     scanf("%d",&n);
    43     for(int i=n/2+1;i<=n;i++)
    44     {
    45         printf("%d",i);
    46         if(i==n)    printf("
    ");
    47         else    printf(" ");
    48     }
    49     for(int i=n/2+1;i<=n;i++)
    50     {
    51         if(i%2==0)  printf("%d",i/2);
    52         else    printf("%d",i);
    53         if(i==n)    printf("
    ");
    54         else    printf(" ");
    55     }
    56 
    57 
    58 
    59     return 0;
    60 }
    View Code
    L The Scarborough Fair

    换硬币,a不够用的时候,从c换a,再从b换c换

     
       
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <set>
     6 #include <queue>
     7 #include <stack>
     8 #include <string>
     9 #include <cstring>
    10 #include <vector>
    11 #include <map>
    12 #include<ctime>
    13 #include <unordered_map>
    14 #define mem( a ,x ) memset( a , x ,sizeof(a) )
    15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ )
    16 #define lson  l ,mid ,pos<<1
    17 #define rson mid+1 ,r ,pos<<1|1
    18 using namespace std;
    19 typedef long long ll ;
    20 typedef pair<int ,int> pii;
    21 typedef pair<ll ,int> pli;
    22 const ll inf = 0x3f3f3f3f;
    23 const ll mod=1e9+7;
    24 const int N=100000+50;
    25 int n,a,b,c;
    26 int w1,w2,w3;
    27 int x,y;
    28 int check(int &aa,int &bb,int &cc,int kk)
    29 {
    30     if(aa>=kk){aa-=kk;  return 1;}
    31     kk-=aa; aa=0;
    32     if(cc/2>=kk)    {cc-=kk*2;  return 1;}
    33     kk-=cc/2;   cc=cc%2;
    34     bb+=cc%2*2;
    35     if(bb/4>=kk)    {bb-=kk*4; cc=0; return 1;}
    36     
    37     return 0;
    38 }
    39 int main()
    40 {
    41     scanf("%d%d%d%d",&n,&a,&b,&c);
    42     for(int i=1;i<=n;i++)
    43     {
    44         scanf("%d%d",&x,&y);
    45         if(x==1)    w1+=y;
    46         else if(x==2)   w2+=y;
    47         else    w3+=y;
    48     }
    49     int ff=0;
    50     if(check(a,b,c,w1)==1)
    51     {
    52         if(check(b,c,a,w2)==1)
    53         {
    54             if(check(c,a,b,w3)==1)
    55             {
    56                 ff=1;
    57             }
    58         }
    59     }
    60     if(ff)  puts("YES");
    61     else    puts("NO");
    62 
    63 
    64     return 0;
    65 }
    View Code

    M

    Cappuccino ~ the end of journey

    倒几杯卡布奇诺。

    dp一下就可。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <set>
     6 #include <queue>
     7 #include <stack>
     8 #include <string>
     9 #include <cstring>
    10 #include <vector>
    11 #include <map>
    12 #include<ctime>
    13 #include <unordered_map>
    14 #define mem( a ,x ) memset( a , x ,sizeof(a) )
    15 #define p( i ,x ,y ) for( int i = x ; i<=y ;i++ )
    16 #define lson  l ,mid ,pos<<1
    17 #define rson mid+1 ,r ,pos<<1|1
    18 using namespace std;
    19 typedef long long ll ;
    20 typedef pair<int ,int> pii;
    21 typedef pair<ll ,int> pli;
    22 const ll inf = 0x3f3f3f3f;
    23 const ll mod=1e9+7;
    24 const int N=100000+50;
    25 int a,b,c,d;
    26 int f[210];
    27 int main()
    28 {
    29     scanf("%d%d%d%d",&a,&b,&c,&d);
    30     f[a]=1;
    31     f[b]=c;
    32     for(int i=1;i<=d;i++)
    33         if(f[i])
    34     {
    35         f[i+a]=max(f[i+a],f[i]+1);
    36         f[i+b]=max(f[i+b],f[i]+c);
    37     }
    38     int ans=0;
    39     for(int i=1;i<=d;i++)
    40         ans=max(ans,f[i]);
    41     printf("%d
    ",ans);
    42 
    43     return 0;
    44 }
    View Code
  • 相关阅读:
    uIP的ARP协议分析
    如何使函数不生成执行代码
    计算机网络基础
    [Hive
    [Hive
    [Hive
    [Hive
    [Hive
    [Hive
    [Hive
  • 原文地址:https://www.cnblogs.com/Kaike/p/13141740.html
Copyright © 2020-2023  润新知