2018网络预选赛 青岛 H
2024-09-02 07:12:00
题目链接:https://pintia.cn/problem-sets/1036903825309761536/problems/1041156323504345088
题意:小明从某一点出发,向右方前进,只有路口是绿灯(用1代表)的时候才可通行,红灯要等待,所有红绿灯每过一秒变化一次(红->绿,绿->红),问从任意一点到该点右边的任意一点的所花费的时间和。
题解:设t(1,n)是从点1到点n所花费的时间,我们可以经过特殊的判断t(1,n)拆分成t(1,a)+t(a,n)+c (c是1,-1,或者0,通过判断得来)。
1:如果该点是红灯(用0代表)且t(1,a)花费了奇数的时间,此时t(a,n)=t(1,n)-t(1,a)+1;
2:如果该点是绿灯且t(1,a)花费了奇数的时间,此时t(a,n)=t(1,n)-t(1,a)-1;
其余情况t(1,n)=t(1,a)+t(a,n),想不太懂可以对照1,2个样例。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
long long sum[maxn],ssum[maxn];
int main(){
int T,cnt,p,S;
char s[100010];
scanf("%d",&T);
long long ans,tmp;
while(T--){
scanf("%s",s+1);
ans=0;
int n=strlen(s+1);
p=1;
sum[0]=ssum[n+1]=0;
for(int i=1;i<=n;i++){
if(s[i]-'0'==p){
sum[i]=sum[i-1]+1;//t(i-1,i)的前缀和,即t(0,i)
p^=1;
}
else{
sum[i]=sum[i-1]+2;
}
}
for(int i=n;i>=1;i--){//后缀和
ssum[i]=ssum[i+1]+sum[i];
}
ans+=ssum[1];
for(int i=2;i<=n;i++){
tmp=sum[i-1];
if(s[i]-'0'==0&&tmp%2==1)tmp--;
if(s[i]-'0'==1&&tmp%2==1)tmp++;
ans+=(ssum[i]-(n-i+1)*tmp);
}
printf("%lld\n",ans);
}
}
最新文章
- PyCharm不能自动import解决方法_PyCharm cannot auto import package troubleshooting
- 斯坦福第五课:Octave 教程(Octave Tutorial)
- 页面多语系自动切换-.resx
- Django 1.6 的测试驱动开发
- 解决OpenWrt多拨刚开机拨号只拨上一次问题
- 快速高效掌握企业级项目中的Spring面向切面编程应用,外带讲面试技巧
- 洛谷最短路计数SPFA
- 记录一个前端bug的解决过程
- Mysql锁机制--读锁
- oracle over 函数几个例子
- Build a Machine Learning Portfolio(构建机器学习投资组合)
- 潭州课堂25班:Ph201805201 django 项目 第四十五课 mysql集群和负载均衡(课堂笔记)
- Android activity 周期图和fragment周期图
- 左移和右移运算符<;<; >;>;
- ie浏览器get url返回404问题
- WebView 5.0+闪烁以及白屏问题完美解决
- .NetCore利用Swagger生成 XML文档需要注意生成路径的地址
- 【DB2】数据库的事务日志已满。SQLSTATE=57011
- Mysql/Mariadb 升级注意事项
- idea配置(卡顿、开发环境等配置),code style template
热门文章
- NAT123之类的软件是如何实现访问域名然后穿透到内网主机的80端口?——有公网ip就是动态域名解析,没有就是穿透+代理转发
- 32 python 并发编程之协程
- GEF入门实例_总结_06_为编辑器添加内容
- LeetCode OJ:Rotate Array(倒置数组)
- LeetCode 362. Design Hit Counter
- webpack 故障处理
- C++中rand()函数的用法
- oracle获得当前时间,精确到毫秒并指定精确位数
- RequireJS 也可以引入 VUE
- 从内存中直接运行PE程序