本喵csp惨遭0分,所以开个帖子每天练习更新
202212-2
#include<iostream>
#include<cstdio>
using namespace std;
int n, m,ans=0;
int prep;
int remember[105];
struct subject
{
int p=0;
int time;
}Sub[105];
int Num(subject a)
{
prep += a.time;
if (a.p != 0) { Num(Sub[a.p]); }
return prep;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> Sub[i].p;
}
for (int i = 1; i <= m; i++) {
cin >> Sub[i].time;
}
for (int i = 1; i <= m; i++) {
if (Sub[i].p == 0) {
if (Sub[i].time > ans)ans = Sub[i].time;
remember[i] = Sub[i].time;
}
if (Sub[i].p != 0) {
prep = Num(Sub[i]); if (prep > ans)ans = prep;
remember[i] = prep;
}
prep = 0;
}
for (int i = 1; i <= m; i++)
{
if (Sub[i].p == 0) { cout << "1"<<" "; }
if (Sub[i].p != 0) { cout << remember[i]-Sub[i].time+1 << " "; }
}
if (ans <= n) {
cout << endl;
for (int i =1; i <= m; i++)
{
cout << n-remember[i]+1 << " ";
}
}
return 0;
}//70分
很明显,本喵只关注了70%的情况
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n, m,ans=0;
int prep=0;
int remember[105];
int count1[105]={0};
struct subject
{
int p=0;
int d=0;
int time=0;
}Sub[105];
int flag = 0;
int s[105]={0};
int Num(subject a)
{
if (a.p != 0) { prep += Sub[a.p].time; Num(Sub[a.p]); }
return prep;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
cin >> Sub[i].p;
}
for (int i = 1; i <= m; i++)
{
cin >> Sub[i].time;
count1[i] = 0;
}
for (int i = m; i >= 1; --i)
{
count1[i] += Sub[i].time;
if (Sub[i].p != 0)
{
count1[Sub[i].p] = max(count1[i], count1[Sub[i].p]);
}
}
for (int i = 1; i <= m; ++i)
{
remember[i] = n - count1[i] + 1;
if (Sub[i].p == 0)
{
s[i] = 1;
}
else
{
s[i] = Num(Sub[i]);
prep = 0;
s[i] += 1;
if (s[i] + Sub[i].time > n)
{
flag = 1;
}
}
}
for (int i = 1; i <= m; ++i) {
cout << s[i] << " ";
}
cout << endl;
if (flag == 0) {
for (int i = 1; i <= m; ++i) {
cout << remember[i] << " ";
}
}
return 0;
}
这是完整ac代码
大概,本题的复杂点在于发现依赖具有方向上的单一性,可以写一个简单的回溯喵。
在线求一个大佬教我呜呜呜