codeforces Round#380 div2
1.字符串替换ogo+go…换成***
思路:找ogo记录g位置,做初步替换和标记,非目标字母直接输出,
间隔为2的判断是否一个为标记g,一个为非标记做***替换
#include<iostream>
using namespace std; bool mark[110] = { 0 };
int tol = 0;
int main()
{
char a[110];
int b[110];
int n, tol = 0, cnt = 0;
cin >> n >> a;
for (int i = 1; i < n-1; i++)
{
if (a[i] == 'g'&&a[i - 1] == 'o'&&a[i + 1] == 'o')b[tol++] = i;
}
for (int i = 0; i < tol; i++)
{
mark[b[i]] = 1;
a[b[i] - 1] = '1';
a[b[i] + 1] = '1';
}
for (int i = 0; i < n; i++)
{
if (!mark[i] && a[i] >= 'a'&&a[i] <= 'z')cout << a[i];
if (mark[i] && !mark[i + 2])cout << "***";
} return 0;
}
2.
题意:给出一个矩阵,对于每个0统计其上下左右有几个方向是1,该点的对应值就是几。计算矩阵中所有0的对应值之和。
考虑O(n*m)左右的时间复杂度
方法一:
先跑一次纵向,求出每个点在纵向上的对应值之和。再跑一次横向,求出每个点在横向上的对应值之和。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 1000 + 10;
typedef long long LL;
const int INF = 1e9 + 10;
int a[maxn][maxn];
int main()
{
int n, m;
while (scanf("%d%d", &n, &m) != EOF)
{
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
scanf("%d", &a[i][j]);
int ans = 0;
for (int i = 0; i < n; ++i)
{
int cnt = 0, flag = 0;
for (int j = 0; j < m; ++j)
{
if (a[i][j] == 0 && (!flag))
cnt++;
else if (a[i][j] == 1)
{
ans += cnt;
cnt = 0;
flag = 1;
}
else if (a[i][j] == 0 && flag)
{
ans++;
cnt++;
}
}
}
for (int j = 0; j < m; ++j)
{
int cnt = 0, flag = 0;
for (int i = 0; i < n; ++i)
{
if (a[i][j] == 0 && (!flag))
cnt++;
else if (a[i][j] == 1)
{
ans += cnt;
cnt = 0;
flag = 1;
}
else if (a[i][j] == 0 && flag)
{
ans++;
cnt++;
}
}
}
printf("%d\n", ans);
}
return 0;
}
方法二:
行累加,列累加,拿行举例,行判断左右,从0->当前列求和,如果0<当前列 就可以往左照,如果最后一列>当前列,就可以往右照。
#include <iostream>
#include <stdio.h>
using namespace std;
int mp[1005][1005];
int row[1005][1005];
int col[1005][1005];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&mp[i][j]);
row[i][j]=row[i][j-1]+mp[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
col[i][j]=col[i-1][j]+mp[i][j];
}
} int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(mp[i][j]==0)
{
if(row[i][j]!=0)
{
sum++;
}
if(row[i][m]!=row[i][j])
{
sum++;
}
if(col[i][j]!=0)
{
sum++;
}
if(col[i][j]!=col[n][j])
{
sum++;
}
}
}
}
cout<<sum<<endl; return 0;
}
3.二分在t时间到达终点所需的最小油量
题意:某人在起点处,到终点的距离为s。 汽车租赁公司提供n中车型,每种车型有属性ci(租车费用),vi(油箱容量)。 车子有两种前进方式 :①. 慢速:1km消耗1L汽油,花费2分钟。 ②.快速:1km消耗2L汽油,花费1分钟。 路上有k个加油站,加油不需要花费时间,且直接给油箱加满。 问在t分钟内到达终点的最小花费是多少?(租车子的费用) 若无法到达终点,输出-1
题解:
不能到达终点的情况:
①.油箱容量最大的汽车在一个加油站到下一个加油站的途中油量耗尽了。
②.全程用快速跑,也不能在t时间内到达终点。
我们可以先求出在t时间内到达终点的最小油箱容量,再在大于等于这个油箱容量中找租车费用最小的车子。 找最小油箱容量用二分查找就行了。 然后再判定不能到到达终点的情况就行了
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2 * 1e5 + 10;
#define LL long long
int c[maxn], v[maxn], g[maxn];
int n, s, k, t, flag; bool judge(LL mid)
{
LL time = 0;
for (int i = 1; i < k; i++)
{
LL dix = g[i] - g[i - 1];
if (dix>mid) //油量mid不足以支撑以慢速到达下一个加油站
return false;
LL fv = (mid - dix) * 2;//fv+sv=mid fv/2+sv=dix 解这个方程组
LL sv = mid - fv;
if (sv < 0) //sv为负数表示,可以全程用快速从上一个加油站跑到当前加油站
time += dix;
else
time += fv / 2 + sv * 2;
}
if (time <= t)
{
flag = 1; //全程快速能在t时间内到达
return true;
}
else
{
return false;
}
} int main()
{
while (scanf("%d%d%d%d", &n, &k, &s, &t) != EOF)
{
for (int i = 0; i < n; ++i)
scanf("%d%d", &c[i], &v[i]);
for (int i = 1; i <= k; ++i)
scanf("%d", &g[i]);
g[0] = 0;//加入起点
g[k + 1] = s;//加入终点
k += 2;
sort(g, g + k); //将油站按位置排序,给出的是乱序
LL left = 0, right = s * 2, mid;
flag = 0;
while (left < right)
{
mid = (left + right) / 2;
if (judge(mid))
right = mid;
else
left = mid + 1;
}
if (!flag) //全程快速也不能在t时间内到达
{
printf("-1\n");
continue;
}
int ans = 1e9 + 10;
for (int i = 0; i < n; i++)
{
if (v[i] >= left)
ans = min(ans, c[i]);
}
if (ans == 1e9 + 10)//表示没有足够大油量的汽车
printf("-1\n");
else printf("%d\n", ans);
}
return 0;
}
4.题意:有n个位置,这里面包含a条船,每条船占b个位置,不知道船的位置。Galya 之前射击过k次,k次都没有打中船。 给出n长度的字符串,0表示未知位置,1表示被Galya射击过的没有船的位置。问要保证 Galya至少射击中一条船,需要再射击几次,并输出这些位置编号。
题解:先算出可能存在船的位置量num,并且记录下每条船的最后一个位置编号。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2 * 1e5 + 10;
char str[maxn];
int ans[maxn];
int main()
{
int n, a, b, k;
while (scanf("%d%d%d%d", &n, &a, &b, &k) != EOF)
{
scanf("%s", str + 1);
int m = 0, cnt = 0;
for (int i = 1; i <= n; ++i)
{
if (str[i] == '0')
{
cnt++;
if (cnt == b)
{
ans[m++] = i;
cnt = 0;
}
}
else if (str[i] == '1')
cnt = 0;
}
printf("%d\n", m + 1 - a);
printf("%d", ans[0]);
for (int i = 1; i <= m - a; ++i)
printf(" %d", ans[i]);
printf("\n");
}
return 0;
}
codeforces Round#380 div2的更多相关文章
- Codeforces Round #539 div2
Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...
- 【前行】◇第3站◇ Codeforces Round #512 Div2
[第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了: ...
- Codeforces Round#320 Div2 解题报告
Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...
- Codeforces Round #564(div2)
Codeforces Round #564(div2) 本来以为是送分场,结果成了送命场. 菜是原罪 A SB题,上来读不懂题就交WA了一发,代码就不粘了 B 简单构造 很明显,\(n*n\)的矩阵可 ...
- Codeforces Round #361 div2
ProblemA(Codeforces Round 689A): 题意: 给一个手势, 问这个手势是否是唯一. 思路: 暴力, 模拟将这个手势上下左右移动一次看是否还在键盘上即可. 代码: #incl ...
- Codeforces Round #626 Div2 D,E
比赛链接: Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) D.Present 题意: 给定大 ...
- CodeForces Round 192 Div2
This is the first time I took part in Codeforces Competition.The only felt is that my IQ was contemp ...
- Codeforces Round #380 (Div. 1, Rated, Based on Technocup 2017 - Elimination Round 2)
http://codeforces.com/contest/737 A: 题目大意: 有n辆车,每辆车有一个价钱ci和油箱容量vi.在x轴上,起点为0,终点为s,中途有k个加油站,坐标分别是pi,到每 ...
- Codeforces Round #380 (Div. 2) 解题报告
第一次全程参加的CF比赛(虽然过了D题之后就开始干别的去了),人生第一次codeforces上分--(或许之前的比赛如果都参加全程也不会那么惨吧),终于回到了specialist的行列,感动~.虽然最 ...
随机推荐
- 【GoLang】golang 交叉编译 实现&工具
apt-get install gcc-mingw-w64 env CGO_ENABLED= GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc g ...
- Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法
Partial 和RenderPartial:这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传值有点不一样Partial 回传的一个Object (MvcHtmlString), 回 ...
- 《oracle每天一练》Oracle之物化视图
相关帖子思考和跟踪 本文转自Ronger 物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实 ...
- Convert a given Binary Tree to Doubly Linked List
The question and solution are from: http://www.geeksforgeeks.org/convert-given-binary-tree-doubly-li ...
- Game of Life I & II
According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellul ...
- linux下的防火墙iptables
防火墙(firewall),也称为防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网.它是一项信息安全的防护系统,依照特定的规则,允许或者是限制传输的数据通过. ...
- redis 中文字符显示
2015年5月20日 09:57:01 星期三 方法一: redis-cli -h --raw 方法二: linux 终端: echo -e "\xe7\xa5\x9e\xe6\xa3\x8 ...
- ABAP 数值类型转换
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = wa_zz-werks IMPOR ...
- js 中 toString( ) 和valueOf( )
1.toString()方法:主要用于Array.Boolean.Date.Error.Function.Number等对象转化为字符串形式.日期类的toString()方法返回一个可读的日期和字符串 ...
- Gson简要使用笔记
最近在做一个java web service项目,需要用到jason,本人对java不是特别精通,于是开始搜索一些java平台的json类库. 发现了google的gson,因为之前对于protoco ...