经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
2018-10-06 Gym-101864F丨STL爽题丨想法
来源:cnblogs  作者:伍玖似十九  时间:2018/10/8 9:14:28  对本文有异议
题意:
  设一个1-n的空间,初始1-k位置占了人,每次操作将x位置的人移动到y位置,保证输入操作合法,求,每次操作后,空间无人的间隔,有多少个(比如01000100100有4个)。
 
思路:
题目给的N很大,无法用数组去模拟,一开始很蒙,但是感谢队友的想法,我写了很短的代码解了这道题。首先,要观察到,每次移动人,对答案的影响,其实只和这个位置相邻的两个位置有关,比如,x位置左右为空的话,取走x上的人,会使得两个间隔合并,于是ans-1。以此类推对于y,如果两个位置为空的,y位置放上人,会使得ans+1。
同理举一反三,可以想到三种情况:1x1,0x1(1x0),0x0,(y同理,且对答案的影响与x相反)那么还有一个困难,前k个位置一开始是有人的。我们可以这样考虑,因为答案只受到每次x和y以及相邻的几个位置有关,那么,对于这几个位置,我们只需要判断是否小于k,你肯定会问,之后呢?
为了方便,用map模拟,对于为0的位置判断是否小于k,就可以知道是否为空,之后,我们对x位置赋2表示被移走,对y位置赋1,表示放入,这样就不需要考虑全局的问题了。
 
参考代码:
  1. #include<stdio.h>
  2. #include<unordered_map>
  3. std::unordered_map<int,int> mp;
  4. int T,Ti,n,k,q;
  5. int change(int x)
  6. {
  7. int l=1,r=1;//has one there;
  8. if(mp[x-1]==2||(x-1>k&&mp[x-1]==0))l=0;
  9. if(mp[x+1]==2||(x+1>k&&mp[x+1]==0))r=0;
  10. return r+l-1;//both are ones,return 1;
  11. }
  12. int main(){
  13. scanf("%d",&T);
  14. while(Ti++<T){
  15. scanf("%d%d%d",&n,&k,&q);
  16. printf("Case %d:\n",Ti);
  17. mp[0]=mp[n+1]=1;
  18. int ans=1;
  19. for(int i=1,x,y;i<=q;i++){
  20. scanf("%d%d",&x,&y);
  21. ans+=change(x);
  22. mp[x]=2;//one on 'x' has been taken;
  23. ans-=change(y);
  24. mp[y]=1;
  25. printf("%d\n",ans);
  26. }
  27. mp.clear();
  28. }
  29. return 0;
  30. }
  31. /*
  32. */
参考代码

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号