第一题: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 }
第四题:大模拟太长了,没做