经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
CF-957(D-E)
来源:cnblogs  作者:mono_4  时间:2024/7/14 13:20:08  对本文有异议

CF-957

赛时A去写全排列……前三题我的写法都挺丑的,后面改进了再更……

Problem - D - Codeforces

虽然是很简单很经典的线性dp,但也是我第一次自己把这种题写出来ヾ(≧▽≦*)o

分析

看题面很容易想到线性递推来更新状态,是一种线性dp。

  • f[i]>=0表示第i个点能被达到,否则不能被达到,因为最多在水中游k米,这一条件会影响是否能达到该点,所以我们用f[i]>=0时的值来表示这一状态,即在第i点最多还能游f[i]米

  • 初始条件:f[0]显然为k,而1~m内的点都在第一次跳跃的范围内,其中s[i]为C情况不能达到,设f[i]=-1,其余点就是f[i]=k,由此m+1~n+1的点都可以通过状态转移递推得到

  • 状态转移:对于在m+1~n+1范围内的点i,如果s[i]为C,显然无法达到,f[i]=-1,而s[i]为W或者L时,点i的状态可以由[i-m,i-1]的点j更新,s[j]=L或者j为0时意味着可以由点j跳到点i,而s[j]为W的情况则只能在j为i-1时更新,表示从i-1游到i,此时要用f[i-1]-1来更新f[i]

最后若判断f[n+1]>=0与否即可

代码

  1. const int N=2e5+5;
  2. int f[N];
  3. void solve() {
  4. int n,m,k;cin>>n>>m>>k;
  5. string s;cin>>s;
  6. s=' '+s;
  7. rep(i,0,n+1) f[i]=-1;
  8. rep(i,0,m){
  9. if(s[i]!='C'||i==0) f[i]=k;
  10. else f[i]=-1;
  11. }
  12. rep(i,m+1,n+1){
  13. if(s[i]!='C'||i==n+1){
  14. rep(j,i-m,i-1){
  15. if(s[j]=='L'||j==0) f[i]=max(f[i],f[j]);
  16. else if(j==i-1&&s[j]=='W') f[i]=max(f[i],f[j]-1);
  17. }
  18. }
  19. else f[i]=-1;
  20. }
  21. if(f[n+1]>=0) cout<<"YES";
  22. else cout<<"NO";
  23. cout<<endl;
  24. }

Problem - E - Codeforces

暴力枚举

分析

注意到a的范围只有1e4,n为一、二、三位数时,n*a最多1e4、1e5、1e6,也就是说,n为一,二,三位数的情况下,a-b分别<=4,5,6,如此我们可以在考虑n的位数的情况下暴力枚举a、b的值求解

代码

  1. int n,_=1e4;
  2. bool f(int w,int a,int b){
  3. int res=0,cnt=0;
  4. if(w==1){
  5. cnt=a-b;
  6. while(cnt--){
  7. res=res*10+n;
  8. }
  9. }
  10. else if(w==2){
  11. cnt=a*2-b;
  12. int now=1;
  13. while(cnt--){
  14. if(now) res=res*10+n/10;
  15. else res=res*10+n%10;
  16. now^=1;
  17. }
  18. }
  19. else{//因为按数据范围,这种情况只有n=100
  20. cnt=a*3-b;
  21. int now=0;
  22. while(cnt--){
  23. if(!now) res=res*10+1;
  24. else res=res*10;
  25. now=(now+1)%3;
  26. }
  27. }
  28. return res==n*a-b;
  29. }
  30. void solve() {
  31. cin>>n;
  32. vector<pair<int,int>>ans;
  33. if(n<10){
  34. rep(i,1,_){
  35. int s=max(i-4,1ll);
  36. rep(j,s,i-1){
  37. if(f(1,i,j)) ans.push_back({i,j});
  38. }
  39. }
  40. }
  41. else if(n<100){
  42. rep(i,1,_){
  43. int s=max(i*2-5,1ll);
  44. rep(j,s,i*2-1){
  45. if(f(2,i,j)) ans.push_back({i,j});
  46. }
  47. }
  48. }
  49. else{
  50. rep(i,1,_){
  51. int s=max(i*3-6,1ll);
  52. rep(j,s,i*3-1){
  53. if(f(3,i,j)) ans.push_back({i,j});
  54. }
  55. }
  56. }
  57. cout<<ans.size()<<endl;
  58. for(auto [a,b]:ans) cout<<a<<" "<<b<<" "<<endl;
  59. }

原文链接:https://www.cnblogs.com/mono-4/p/18301379

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

本站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号