主页
搜索
最近更新
数据统计
申请密钥
系统公告
1
/
1
请查看完所有公告
7.29暑期第五节课下午总结
最后更新于 2025-07-30 23:24:27
作者
yukuangye
分类
个人记录
复制 Markdown
查看原文
删除文章
更新内容
# B3846 [GESP样题 一级] 闰年求和 ## 错误原因 把起点和终点算进去了 ## 解题思路 把是闰年的年份累加,不用算起终点 代码: ```cpp #include<bits/stdc++.h> using namespace std; int main(){ long long n,m,sum=0; cin>>n>>m; for(int i=n+1;i<m;i++){ if(i%400==0||(i%4==0&&i%100!=0)){ sum+=i; } } cout<<sum; return 0; } ``` # P1086 [NOIP 2004 普及组] 花生采摘 ## 错误原因 半点思路没有(炸了) ## 解题思路 ### 1、结构体输入 因为每一株花生对应的点是固定的,所以我们应用结构体输入 代码: ```cpp struct node{ int x,y,cnt; }a[405]; int m,n,idx=0,T;//T为给定时间 cin>>m>>n>>T; for(int i=1;i<=m;i++){//i,j为行和列 for(int j=1;j<=n;j++){ int x; cin>>x; ++idx; a[idx]={i,j,x}; } } ``` ### 2、按花生多少排序 题目要小猴按剩下的花生最多的一株采摘,所以要按花生多少排列 代码: ```cpp int cmp(node a,node b){ if(a.cnt>b.cnt) return 1; else return 0; } ···//省略 sort(a+1,a+idx+1,cmp); ``` ### 3、计算时间及总共可以获得的花生数 如果时间不够小猴跳到第一株花生,采摘,再回来,就输出0 如果时间可以让小猴跳到第一株花生采摘再回来,则时间减去第一株花生所在的行数,再减一(采摘时间),再进行下一次判断 可以定义一个px代表第a[i]株花生的行,py代表第a[i]株花生的列,back为从a[i]返回路边的距离,ans为累计采摘的花生 则小猴跳到下一株花生的时间为abs(px-a[i].x)+abs(py-a[i].y) 如果小猴不能跳到第a[i]株花生,采摘并返回,就直接返回,然后输出ans 否则T减去小猴跳到第a[i]株并采摘的时间 代码: ```cpp if(a[1].x*2+1>T){ cout<<0; }else{ T=T-a[1].x-1; int px=a[1].x,py=a[1].y; int ans=a[1].cnt; for(int i=2;i<=idx;i++){ int dx=abs(px-a[i].x)+abs(py-a[i].y); int back=a[i].x; if(dx+back+1>T){ break; } T=T-dx-1; ans+=a[i].cnt; px=a[i].x,py=a[i].y; } cout<<ans; } ``` ## 最终代码 ```cpp #include<bits/stdc++.h> using namespace std; struct node{ int x,y,cnt; }a[405]; int cmp(node a,node b){ if(a.cnt>b.cnt) return 1; else return 0; } int main(){ int m,n,idx=0,T; cin>>m>>n>>T; for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ int x; cin>>x; ++idx; a[idx]={i,j,x}; } } sort(a+1,a+idx+1,cmp); if(a[1].x*2+1>T){ cout<<0; }else{ T=T-a[1].x-1; int px=a[1].x,py=a[1].y; int ans=a[1].cnt; for(int i=2;i<=idx;i++){ int dx=abs(px-a[i].x)+abs(py-a[i].y); int back=a[i].x; if(dx+back+1>T){ break; } T=T-dx-1; ans+=a[i].cnt; px=a[i].x,py=a[i].y; } cout<<ans; } return 0; } ```
正在渲染内容...
点赞
0
收藏
0