A-位数求和
题目描述
牛牛想知道所有的长度为n的数中,各个位上的数字之和为m的这些数的和是多少呢。给定n和m,求这些数的和。
做法1:n比较小 直接暴力dfs
做法 dp做法
dp[i][j][k] 代表第i位 填数字j 每位的和为k 时 数的和。很绕。我这里贴的是带main函数的,需要的 直接复制那个函数才可以提交AC
#include<bits/stdc++.h>
using namespace std;
//dp[i][j][k] 第i位为j 每位和为k 的所有数 之和
long long sum(int n, int m) {
// write code here
long long dp[n+10][10][m+10];
int f[n+10][10][m+10];
memset(dp,0,sizeof(dp));
memset(f,0,sizeof(f));
f[0][0][0]=1;
int base=1;
for(int i=1;i<=n;++i){
for(int j=0;j<=9;++j){
for(int k=0;k<=9;++k){
for(int s=0;s+j<=m;++s){
if(!f[i-1][k][s]) continue;
dp[i][j][s+j]+=dp[i-1][k][s]+j*base*f[i-1][k][s];
f[i][j][s+j] += f[i-1][k][s];
}
}
}
base=base*10;
}
long long ans = 0;
for(int j = 0; j <= 9; ++j)
if(f[n][j][m])
{
ans += dp[n][j][m] - dp[n-1][j][m];//去掉前导零
}
return ans;
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
cout<<sum(n,m)<<endl;
}
B-不可思议
做法:做法果然很不可思议。我说这能做?结果一看标程 暴力往上跑即可??原理啥的不懂,这居然能不超时,个人猜测题目给的造树代码 树高是log级别的所以才可以暴力做
C-牛牛晾衣服
扫描二维码关注公众号,回复: 11413210 查看本文章wa到自闭,这题意 是 烘干机每分钟可以吹k-1滴水 加上自然干 1滴水。我服了,我以为用烘干机 就不存每分钟干一滴水。。。
简单的二分题。
class Solution {
public:
/**
* 计算最少要多少时间可以把所有的衣服全烘干
* @param n int整型 n件衣服
* @param a int整型vector n件衣服所含水量数组
* @param k int整型 烘干机1分钟可以烘干的水量
* @return int整型
*/
int check(vector<int>a,int mid,int k)
{
int now = 0;
for(int i = 0; i < a.size(); ++i){
if(a[i] <= mid) continue;
int hua = (a[i]-mid)/(k-1);
if((a[i]-mid)%(k-1)) hua++;
now+=hua;
}
return now <= mid;
}
int solve(int n, vector<int>& a, int k) {
// write code here
int l = 1, r = 1e9, ans = 1e9;
//sort(a.begin(),a.end());
while(l <= r){
int mid = l + r >> 1;
if(check(a,mid,k)) ans=mid,r=mid-1;
else l=mid+1;
}
return ans;
}
};