第一题:n个1*1*1立方体组成的立体结构(立方体可以悬空),求表面积

思路:假设初始表面积是6*n,看哪些相交减去即可。

代码:弄丢了

 

第二题:求一个连续楼层的能放的最大广告牌面积。

思路:很经典的单调栈例题

代码:https://blog.csdn.net/ranwen2/article/details/70943498

 

第三题:有多少数满足以下条件。(可以带前缀0)

1.由n个十进制数组成。

2.每三位可以被x整除。

3.每位上的总和为s。

(3<=n<=50,s<=9*n,0<=x<=999)

思路:dp[i][j][k]表示在第i位的情况下,以第i位为末尾的连续三位数为j,目前所有位置上数字总和为k。推一下dp,即可,我做了一些优化。

代码:

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <stack>
 5 #include <map>
 6 using namespace std;
 7 typedef long long ll;
 8 const ll maxn = 1e5 + 5;
 9 ll dp[51][1005][460];
10 bool vis[1005];
11 ll num[1005];
12 const ll mod=1000009;
13 int main() {
14     ll n, sum, last, w, x, s, i, j, t,k, ss,ans = 0, cnt;
15     while (cin >> n >> s >> x) {
16         cnt = 1;
17         map<ll,ll>mp;
18         memset(vis, false, sizeof(vis));
19         memset(dp, 0, sizeof(dp));
20         for (i = 0; i < 1000; i++)
21             if (i % x == 0)
22                mp[i]=cnt, num[cnt++] = i, vis[i] = true;
23         for(i=1;i<cnt;i++)
24         {
25              w=num[i]%10;
26              t=(num[i]/10)%10;
27              ss=num[i]/100;
28              sum=ss*100+t*10+w;
29             dp[3][i][ss+t+w]=1;
30         }
31         for(i=3;i<=n-1;i++)
32         {
33             for(j=1;j<cnt;j++)
34             {
35                 sum=num[j]%100;
36                 for(t=0;t<10;t++)
37                 {
38                     if(vis[sum*10+t])
39                     {
40                         w=mp[sum*10+t];
41                         for(k=0;k<=450;k++)
42                         {
43                             dp[i+1][w][k+t]=(dp[i][j][k]+dp[i+1][w][k+t])%mod;
44 
45                         }
46                     }
47                 }
48             }
49         }
50         sum=0;
51         for(i=1;i<cnt;i++)
52             sum=(dp[n][i][s]+sum)%mod;
53        cout<<sum<<endl;
54 
55     }
56     return 0;
57 }

 第四题:大模拟太长了,没做

posted on 2020-04-25 15:58  Carits  阅读(395)  评论(0编辑  收藏  举报