目录
看完题目后,我们了解到了其实题目就是一个模拟的题目,无疑就是模拟Bessie在数轴上的行动,模拟的答案是Bessie在数轴上击破的炮击目标,只是每个数轴上的整数点上都有一个需要处理的子任务。根据题意,子任务大致有两种:
在细分该子任务的其他子任务,那么每一个点上都有一个结果:
还需要考虑什么时候结束:
那么这些我们都列举出来了,模拟这个过程也就轻而易举了。
模拟代码如下:
- #include
- using namespace std;
- long long n,s,p,q[100005],v[100005],ans,k=1;
- bool flag,m[100005];
- int main()
- {
- cin>>n>>s;
- p=s;
- for(int i=1;i<=n;i++)
- {
- cin>>q[i]>>v[i];
- }
- if(q[p]==1)
- {
- if(k>=v[p]&&m[p]==0)
- {
- ans++;
- m[p]=1;
- }
- }
- else
- {
- k+=v[p];
- flag=1;
- }
- while(p>=1&&p<=n)
- {
- if(flag==0)
- {
- p+=k;
- if(q[p]==1)
- {
- if(k>=v[p]&&m[p]==0)
- {
- ans++;
- m[p]=1;
- }
- }
- else
- {
- k+=v[p];
- if(flag==1)
- {
- flag=0;
- }
- else
- {
- flag=1;
- }
- }
- }
- else
- {
- p-=k;
- if(q[p]==1)
- {
- if(k>=v[p]&&m[p]==0)
- {
- ans++;
- m[p]=1;
- }
- }
- else
- {
- k+=v[p];
- if(flag==1)
- {
- flag=0;
- }
- else
- {
- flag=1;
- }
- }
- }
- //cout<
- }
- cout<
- return 0;
- }
75分代码分析
我们用两个整形数组分别储存v和q,然后再用一个bool的数组储存该炮击目标是否被炮击过,再用一个bool的变量判断向左还是向右(0向右,1向左),那么程序的模拟范围就在[1,n]中,再根据上述我们列出的的子任务和结果进行模拟,那么结果就非常轻松地出来了。
但......
上述代码结果如下
只有75分......
我们发现T了5个点。
该怎么办呢?我们不妨猜一下当Bessie在数轴上的两个跳板之间来回跳跃,那是不是就死循环了。题目中有一句话:
- 如果 Bessie 弹跳无限长的时间或直到她离开数轴,她会击破多少个炮击目标?
也就是说但Bessie 弹跳无限长的时间或直到她离开数轴时,这个模拟程序就结束。我们好像并没有考虑到要判断是否弹跳无限长时间。所以T了。
那我们只需要加一个变量t,放在while的开头,每次都+1,如果Bessie跳到了炮击目标上,就将t给清零,因为并没有在反复跳,当tn时,也就意味着我已经弹跳了超过n次且没有到过炮击目标,也就是跳跃时间无限长的情况,我们满足这个情况跳出这个模拟程序即可。
修改后程序的模拟部分代码
那么模拟程序也就会变成下面这个程序:
- while(p>=1&&p<=n)
- {
- r++;
- if(r==n)
- {
- break;
- }
- if(flag==0)
- {
- p+=k;
- if(q[p]==1)
- {
- if(k>=v[p]&&m[p]==0)
- {
- ans++;
- m[p]=1;
- r=0;
- }
- }
- else
- {
- k+=v[p];
- if(flag==1)
- {
- flag=0;
- }
- else
- {
- flag=1;
- }
- }
- }
- else
- {
- p-=k;
- if(q[p]==1)
- {
- if(k>=v[p]&&m[p]==0)
- {
- ans++;
- m[p]=1;
- r=0;
- }
- }
- else
- {
- k+=v[p];
- if(flag==1)
- {
- flag=0;
- }
- else
- {
- flag=1;
- }
- }
- }
- //cout<
- }
这样这个问题就结束了。
AC代码
附上AC代码
- #include
- using namespace std;
- long long n,s,p,q[100005],v[100005],ans,k=1,r;
- bool flag,m[100005];
- int main()
- {
- cin>>n>>s;
- p=s;
- for(int i=1;i<=n;i++)
- {
- cin>>q[i]>>v[i];
- }
- if(q[p]==1)
- {
- if(k>=v[p]&&m[p]==0)
- {
- ans++;
- m[p]=1;
- }
- }
- else
- {
- k+=v[p];
- flag=1;
- }
- while(p>=1&&p<=n)
- {
- r++;
- if(r==n)
- {
- break;
- }
- if(flag==0)
- {
- p+=k;
- if(q[p]==1)
- {
- if(k>=v[p]&&m[p]==0)
- {
- ans++;
- m[p]=1;
- r=0;
- }
- }
- else
- {
- k+=v[p];
- if(flag==1)
- {
- flag=0;
- }
- else
- {
- flag=1;
- }
- }
- }
- else
- {
- p-=k;
- if(q[p]==1)
- {
- if(k>=v[p]&&m[p]==0)
- {
- ans++;
- m[p]=1;
- r=0;
- }
- }
- else
- {
- k+=v[p];
- if(flag==1)
- {
- flag=0;
- }
- else
- {
- flag=1;
- }
- }
- }
- //cout<
- }
- cout<
- return 0;
- }
完结,感谢阅读。
-
相关阅读:
《对比Excel,轻松学习Python数据分析》读书笔记------结果导出
OpenGL入门(四)之纹理Texture
css魔法--利用css变量打造滚动指示器
资源分享 | 情绪脑电研究公开数据集
c++ static
对时序数据进行分类与聚类
树莓派通过frp实现内网穿透打通ssh[操作记录]
基于帧间差分法的视频目标检测研究-含Matlab代码
A. Common Prefixes
JAVA8 - java.util.function.Predicate
-
原文地址:https://blog.csdn.net/lsj0929/article/details/136220428