第一題: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 }
第四題:大模擬太長了,沒做
浙公網安備 33010602011771號