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

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

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("\n");
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\n"); return 0;}
41     ll ans=(n-st)/lc+1;
42     printf("%lld\n",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\n",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\n",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\n",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("\n");
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("\n");
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\n",ans);
42 
43     return 0;
44 }
View Code

 

posted @ 2020-06-16 16:35  kaike  阅读(233)  评论(0编辑  收藏  举报