2024.08.17京东
1. 桩子与雪
村子里有一些桩子,从左到右高度依次为1,1+2,1+2+3…,每两颗桩子之间的间隔为1.现在下了一场大雪,
但是不知道雪下了多厚,现在给你两个数字,这是雪后某相邻两个桩子在雪面的高度,请你通过这两个数字计算雪的厚度。
简单计算
int main(int argc, char *argv[]) {
int a,b;
cin>>a>>b;
int sub = b-a;
cout<<(1+sub)*sub/2-b;
return 0;
}
2. 拼接积木
牛牛有一种锯齿状的积木,这种积木比较长,但是每个单位长度的高度是相等的,高度为1或者2。
现在牛牛拿出了两块长度分别为n 和 m 的积木,她现在想把这两块积木拼接在一起,即使中间有空隙也没有关系。
但是拼接后的积木的高度要不超过 3,请你帮助牛牛计算在满足这个前提下拼接后的积木的长度最短可以是多少。
暴力模式串匹配
int main(int argc, char *argv[]) {
int n,m;
cin>>n>>m;
string wood1; string wood2;
cin>>wood1>>wood2;
int res = m + n;
for(int i=0;i<n;i++){
int idx1 = i; int idx2 = 0;
while(idx1<n&&idx2<m){
int h = (wood1[idx1]-'0')+(wood2[idx2]-'0');
if(h==4) break;
idx1++;idx2++;
}
if(idx1==n||idx2==m)
res = min(res,i+max(n-i,m));
}
for(int i=0;i<m;i++){
int idx1 = 0; int idx2 = i;
while(idx1<n&&idx2<m){
int h = (wood1[idx1]-'0')+(wood2[idx2]-'0');
if(h==4) break;
idx1++;idx2++;
}
if(idx1==n||idx2==m)
res = min(res,i+max(m-i,n));
}
cout<<res;
return 0;
}
3. 牛牛回家
牛牛所在的国家有n座城市,m条有向道路,第i条道路由城市通往城市,通行费为。
作为一头豪气的牛,希望他回家的花费是一个特殊的数字(例如666元)。具体的说,牛牛希望从城市1移动到城市n,并恰好花费a元y
请你告诉牛牛,他有多少种回家的方案?
注意是有向路径,且有重复路径,使用邻接表方便
计算路径数目就是正常的动态规划,不过这里类似背包和弗洛伊德
需要先遍历背包上限,然后以所有点作为中转点,推导下一个状态
int main() {
int n,m,a;//城市,道路,花费
cin>>n>>m>>a;
vector<vector<pair<int,int>>>graph(n+1);//领接表存储路径花费,因为有重复路径
for(int i=0;i<m;i++){
int from,to,fee;
cin>>from>>to>>fee;
graph[from].push_back({to,fee});
}
const int INF = 20220201;
//牛牛从城市1开始移动,dp[i][j]表示移动到城市i恰好花费j的路径数目, 20220201
vector<vector<int>> dp(n+1,vector<int>(a+1,-1));
vector<vector<bool>>st(n+1,vector<bool>(a+1,0));
dp[1][0] = 1;
for(int i=0;i<a;i++){//遍历所有费用,往后转移
for(int v=1;v<=n;v++){//遍历所有中转点
if(dp[v][i]>=0){//如果有数可以进行转移
for(auto &[u,w]:graph[v]){//遍历中转点的连通点
if(i+w<=a){//费用不超过a,进行转移
if(dp[u][i+w]==-1) dp[u][i+w] = 0;//表示可达
if(dp[u][i+w]+dp[v][i]>=INF||st[v][i]) st[u][i+w] = true;//表示路径数大于阈值
dp[u][i+w] = (dp[u][i+w]+dp[v][i])%INF;
}
}
}
}
}
if(st[n][a]) cout<<"All roads lead to Home!"<<endl;
cout<<dp[n][a]<<endl;
return 0;
}