C语言I博客作业03

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/CST2020-3/
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2020-3/homework/11454
这个作业的目标 进一步了解for循环与C语音的练习
学号 20209010

1.PTA实验作业(15分/题)

1.1本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和

1.1.1实验代码截图

1.1.2数据处理

数据表达:有整型变量i,n,flag,d;浮点型变量item,sum;除n通过输入,其他通过赋值。

数据处理:循环结构,表达式:

item=flag*1.0/d;
sum=sum+item;
flag=-flag;
d=d+3;

1.1.3PTA提交列表及说明

 说明:和书上例题差不多,没有大问题。

1.2计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

1.2.1实验代码截图

 

 1.2.2数据处理

数据表达:整型变量n,k.浮点形变量i,j,sum。除了n通过输入,其他通过赋值。

数据处理:循环结构,表达式:

sum+=j/i;
double x=i;
i=j;
j=j+x;

 

1.2.3 PTA提交列表及说明

说明:通过不断测试,终于正确。

1.3据说汪星人的智商能达到人类 4 岁儿童的水平,更有些聪明汪会做加法计算。比如你在地上放两堆小球,分别有 1 只球和 2 只球,聪明汪就会用“汪!汪!汪!”表示 1 加 2 的结果是 3。

本题要求你为电子宠物汪做一个模拟程序,根据电子眼识别出的两堆小球的个数,计算出和,并且用汪星人的叫声给出答案。

1.3.1实验代码截图

 

 1.3.2数据处理

数据表达:整型变量i,n,m,x。其中n,m,通过输入,其他通过赋值。

数据处理:循环结构;表达式:x=m+n

1.3.3 PTA提交列表及说明

 说明:该题比较容易,没有大问题

2,阅读代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=40005;
long long r[N*12];
int n;
long long w,h;
int tot,cnt;
long long mx=0;
long long maxl(long long a,long long b)
{return a>b?a:b;}
struct line
{
long long x,y1,y2,c;
}pos[N*6];
bool cmp(line a,line b)
{
if(a.x==b.x)return a.c<b.c;
return a.x<b.x;
}
struct sgtr
{
int l,r;
long long dat;
long long add;
}tr[N*6];
void build(int p,int l,int r)
{
tr[p].l=l,tr[p].r=r,tr[p].dat=tr[p].add=0;
if(l==r)return;
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
}
void spread(int p)
{
if(tr[p].l==tr[p].r)return;
if(tr[p].add)
{
tr[p*2].dat+=tr[p].add;
tr[p*2+1].dat+=tr[p].add;
tr[p*2].add+=tr[p].add;
tr[p*2+1].add+=tr[p].add;
}
tr[p].add=0;
}
void change(int p,int l,int r,long long x)
{
if(l<=tr[p].l&&r>=tr[p].r)
{
tr[p].dat+=x;
tr[p].add+=x;
return;
}
spread(p);
int mid=(tr[p].l+tr[p].r)/2;
if(l<=mid)change(p*2,l,r,x);
if(r>mid)change(p*2+1,l,r,x);
tr[p].dat=maxl(tr[p*2].dat,tr[p*2+1].dat);
}
void make()
{
sort(r+1,r+tot+1);
for(int i=1;i<=cnt;i++)
{
//pos[i].x=lower_bound(r+1,r+tot+1,pos[i].x)-r;
pos[i].y1=lower_bound(r+1,r+tot+1,pos[i].y1)-r;
pos[i].y2=lower_bound(r+1,r+tot+1,pos[i].y2)-r;
mx=maxl(mx,maxl(pos[i].y2,pos[i].y1));
}
sort(pos+1,pos+cnt+1,cmp);
}
void init()
{
memset(&tr,0,sizeof tr);
memset(&pos,0,sizeof pos);
memset(r,0,sizeof r);
mx=tot=cnt=0;
}
int main()
{
while(scanf("%d%I64d%I64d",&n,&w,&h)!=EOF)
{
init();
for(int i=1;i<=n;i++)
{
long long a,b,c;
scanf("%I64d%I64d%I64d",&a,&b,&c);
pos[++cnt].x=a,pos[cnt].y1=b,pos[cnt].y2=b+h-1,pos[cnt].c=c;
pos[++cnt].x=a+w,pos[cnt].y1=b,pos[cnt].y2=b+h-1,pos[cnt].c=-c;
r[++tot]=b,r[++tot]=b-1,r[++tot]=b+1,r[++tot]=b+h-1,r[++tot]=b+h,r[++tot]=b+h+1;
}
make();
build(1,1,mx+10);
unsigned long long ans=0;
for(int i=1;i<=cnt;i++)
{
//cout<<"push "<<pos[i].y1<<" "<<pos[i].y2<<" "<<pos[i].c<<endl;
change(1,pos[i].y1,pos[i].y2,pos[i].c);
ans=maxl(ans,tr[1].dat);
//cout<<ans<<endl;
}
printf("%I64d\n",ans);
}
}

 该代码看起来复杂,但是很好理解;

其中有循环结构,条件结构等等,还有一些字符变化。可以学到我们思维要清晰。

 

3.学习总结

3.1学习进度条

周/日期 这周花的时间 代码行 学到知识简介 疑惑问题
第三周 5小时 452 for循环 阶乘问题

3.2累积代码行和博客字数

时间 博客字数 代码行数
第一周 231 125
第二周 253 472
第三周 452 436

 

3.3 学习感悟

通过这一周的学习我认识到学习c语音的各类语句语法 想要进一步提升计算机水平只能更加努力学习这门专业并且多敲代码这样才能使水平更进一步

 

posted @ 2020-11-08 11:24  别多想  阅读(94)  评论(0编辑  收藏  举报