作业03

这个作业属于哪个课程 <班级的链接>
这个作业要求在哪里 <作业要求的链接>
这个作业的目标 <你理解的作业目标具体内容>
学号 <20209059>
1.PTA实验作业
1.1本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和
1.2.1实验代码截图
1.1.1数据处理
数据表达:变量有 denomeinator,flag,N,i,item,sum,用int,douuble賦值而來。int 为整点型,douuble 为双精度浮点型。
数据处理:for的循环结构,item=flag*1.0/denominator; sum=sum+item; flag=-flag; denominator=denoinator+3。
1.1.3 PTA提交列表及说明

Q1:一直都是内部错误
A1:問了別人才知道sum兩邊沒有空格
Q2:不知道格式
A2:在📕上找到了
1.2要求读入1个整数X,然后输出1+2+3+...X 的和
1.2.1实验代码截图

1.2.2数据处理
数据表达:变量有i,x,sum。都由int賦值而來。int 为整点型。
数据处理:for的循环结构, sum=sum+i。
1.2.3 PTA提交列表及说明

Q1:這題中sum=sum+i,我把i弄成1,一直不知道哪錯
A2.在编写程序中,要認真。
1.3.1实验代码截图.3本题要求程序,计算平方根序列前N项和

1.3.2数据处理
数据表达:变量有i,n,sum。,用int,douuble賦值而來。int 为整点型,douuble 为双精度浮点型。
数据处理:for的循环结构,sum=sum+sqrt(i)
1.1.3 PTA提交列表及说明

Q:那個平方根不知道怎搞
A:后來在百度上查到了。
2.阅读代码
------------恢复内容开始------------

这个作业属于哪个课程 <班级的链接>
这个作业要求在哪里 <作业要求的链接>
这个作业的目标 <你理解的作业目标具体内容>
学号 <20209059>
1.PTA实验作业
1.1本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和
1.2.1实验代码截图
1.1.1数据处理
数据表达:变量有 denomeinator,flag,N,i,item,sum,用int,douuble賦值而來。int 为整点型,douuble 为双精度浮点型。
数据处理:for的循环结构,item=flag*1.0/denominator; sum=sum+item; flag=-flag; denominator=denoinator+3。
1.1.3 PTA提交列表及说明

Q1:一直都是内部错误
A1:問了別人才知道sum兩邊沒有空格
Q2:不知道格式
A2:在📕上找到了
1.2要求读入1个整数X,然后输出1+2+3+...X 的和
1.2.1实验代码截图

1.2.2数据处理
数据表达:变量有i,x,sum。都由int賦值而來。int 为整点型。
数据处理:for的循环结构, sum=sum+i。
1.2.3 PTA提交列表及说明

Q1:這題中sum=sum+i,我把i弄成1,一直不知道哪錯
A2.在编写程序中,要認真。
1.3.1实验代码截图.3本题要求程序,计算平方根序列前N项和

1.3.2数据处理
数据表达:变量有i,n,sum。,用int,douuble賦值而來。int 为整点型,douuble 为双精度浮点型。
数据处理:for的循环结构,sum=sum+sqrt(i)
1.1.3 PTA提交列表及说明

Q:那個平方根不知道怎搞
A:后來在百度上查到了。
2.阅读代码

include

include

include

include

include

include

include <assert.h>

using namespace std;

define debug(x) cout << #x << ": " << x << "\n";

define debug2(x, y) cout << #x << ": " << x << ", " << #y << ": " << y << "\n";

const int maxn = 1e6 + 7;
const double eps = 1e-8;

typedef long long ll;
int n;
int dep[maxn], ye[maxn];
vector adj[maxn];
void dfs(int u, int d) {
dep[u] = d;
ye[u] = 0;
for(int v: adj[u]) {
dfs(v, d + 1);
ye[u] = max(ye[u], ye[v] + 1);//子树最深叶子深度
}
}
ll ans;
int id;
bool cmp(const int &a, const int &b) {
if(ye[a] != ye[b]) return ye[a] < ye[b];
return a < b;
}
void dfs2(int u, int ba, int h, int d) {
//cout << u << " " << d << endl;
if(adj[u].size() == 0) {
ans += d;
id = u;//上一次军队停留的叶子
return;
}
for(int v: adj[u]) {
if(id == 0) {//这条路径前没有可产生贡献的军队停留,径直往下走
dfs2(v, u, h + 1, d + 1);
}else {
int w = dep[id] - dep[u];
if(w < h) {//如果从上次军队停留的叶子出发比从根节点出发更优
id = 0;//军队就继续出发,所以就没有军队停留了
dfs2(v, u, h + 1, w + 1);
}else {
id = 0;//上个叶子对这条路径产生不了贡献,以后也必不可能产生贡献
dfs2(v, u, h + 1, h + 1);
}
}
}
}
int main() {
//freopen("in.txt", "r", stdin);
int T;scanf("%d",&T);
int kase = 0;
while(T--) {
id = 0;
ans = 0;
scanf("%d", &n);
for(int i = 2; i <= n; ++i) {
int f; scanf("%d", &f);
adj[f].push_back(i);
}
dfs(1, 0);
//按最深子叶深度从小到大排序,排序是精髓
for(int i = 1; i <= n; ++i) sort(adj[i].begin(), adj[i].end(), cmp);
dfs2(1, 0, 0, 0);
printf("Case #%d: %lld\n", ++kase, ans);
for(int i = 1; i <= n; ++i) adj[i].clear();
}
return 0;
}
/*
7
14
1 2 3 3 5 3 7 8 2 10 11 12 13
3
1 1
6
1 2 3 4 4
9
1 2 2 4 5 1 7 8
12
1 2 3 1 5 6 4 4 12 9 11
7
1 2 3 3 2 5
6
1 2 3 3 2
20
1 2 3 4 5 4 7 7 9 2 8 11 11 11 10 9 16 16 12

17
2
6
9
12
8
7
29
*/
第一次看到這麽長的代碼,絕對是傻了的,但也可以看出代碼的埆可以解決一些問題,
特別他運用了for的循环结构和while的循环结构及分支结构。
3.学习总结
3.1 学习进度条
|周/日期 |这周所花的时间 |代码行 |学到的知识点简介 |目前比较迷惑的问题 |
| ---- | ---- | ---- | ---- | ---- | ---- |
|第三周/11.7-11.8 | 10 小時 |182 |for的循环结构,平方根的運用 |循环語句的運用不熟練,符号含义分不清,调试不懂 |
3.2 累积代码行和博客字数

3.3 学习感悟
1.在编程这方面要自己努力钻研
2.自学能力还有待增强
3.要多实际操作,熟能生巧

posted @ 2020-11-08 11:38  大胖娃xxr  阅读(85)  评论(0)    收藏  举报