70分代码 C语言
//图论 、拓扑排序;最晚时间建反向图
#include <stdio.h>
int main() {
int n,m,i;
int p[105] = {0},q[105] = {0},s[105] = {0};
scanf("%d%d",&n,&m);
for ( i = 0; i < m; i++) {
scanf("%d",&p[i]); //依赖
}
for (i = 0; i < m; i++) {
scanf("%d",&q[i]); //天数
}
s[0] = 1; //第一个数没有前面的编号科目,所以无依赖
for (i = 1; i < m; i++) { //从第2位数,下标为1,开始判断
if (p[i] == 0)
s[i] = 1;
else {
s[i] = s[p[i]-1] + q[p[i] - 1]; //-1 ,因为下标从0开始 //被依赖开始的天数+被依赖持续的天数
}
}
for (i = 0; i < m; i++){
printf("%d ",s[i]);
}
return 0;
}
方法
暴力解法
时间复杂度O(1);
满分代码 C++
#include<bits/stdc++.h>
using namespace std;
int n,m;
map<int, int> deps;
int days[101]={0};
int minStart[101]={0};
int maxStart[101]={0};
int main(){
// 加速cin,cout
ios::sync_with_stdio(false);
std::cin.tie(0);
// 方便输入和调试代码
// freopen("../io/input.txt", "r", stdin);
cin>>n>>m;
// 读取依赖关系
for(int i=1; i<=m; i++){
int d;
cin>>d;
deps[i]=d;
}
// 读取需要的时间
for(int i=1; i<=m; i++){
int d;
cin>>d;
days[i]=d;
}
// 计算最早开始时间
for(int i=1; i<=m; i++){
if(deps[i] == 0){
minStart[i] = 1;
}else{
minStart[i] = minStart[deps[i]]+days[deps[i]];
}
}
// 计算最晚开始时间
for(int i=m; i>=1; i--){
// 当前节点没有更新过最晚时间
if(maxStart[i]==0){
maxStart[i]=n-days[i]+1;
}
if(deps[i]!=0){
// 已经更新过
if(maxStart[deps[i]]!=0){
maxStart[deps[i]] = min(maxStart[deps[i]], maxStart[i]-days[deps[i]]);
}else{
maxStart[deps[i]] = maxStart[i]-days[deps[i]];
}
}
}
bool can=true;
// 输出最早开始时间
for(int i=1; i<=m; i++){
if(maxStart[i]<=0){
can = false;
}
cout<<minStart[i];
if(i!=m){
cout<<" ";
}
}
// 判断是否能够都完成
if (!can){
return 0;
}
cout<<endl;
// 输出最晚开始时间
for(int i=1; i<=m; i++){
cout<<maxStart[i];
if(i!=m){
cout<<" ";
}
}
return 0;
}
总结
第一时间只想到暴力解法,后续高级算法还得加强磨练!