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的更多相关文章

  1. Codeforces Round #539 div2

    Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...

  2. 【前行】◇第3站◇ Codeforces Round #512 Div2

    [第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了: ...

  3. Codeforces Round#320 Div2 解题报告

    Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...

  4. Codeforces Round #564(div2)

    Codeforces Round #564(div2) 本来以为是送分场,结果成了送命场. 菜是原罪 A SB题,上来读不懂题就交WA了一发,代码就不粘了 B 简单构造 很明显,\(n*n\)的矩阵可 ...

  5. Codeforces Round #361 div2

    ProblemA(Codeforces Round 689A): 题意: 给一个手势, 问这个手势是否是唯一. 思路: 暴力, 模拟将这个手势上下左右移动一次看是否还在键盘上即可. 代码: #incl ...

  6. Codeforces Round #626 Div2 D,E

    比赛链接: Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) D.Present 题意: 给定大 ...

  7. CodeForces Round 192 Div2

    This is the first time I took part in Codeforces Competition.The only felt is that my IQ was contemp ...

  8. 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,到每 ...

  9. Codeforces Round #380 (Div. 2) 解题报告

    第一次全程参加的CF比赛(虽然过了D题之后就开始干别的去了),人生第一次codeforces上分--(或许之前的比赛如果都参加全程也不会那么惨吧),终于回到了specialist的行列,感动~.虽然最 ...

随机推荐

  1. Jquery ajax调用webservice总结

    jquery ajax调用webservice(C#)要注意的几个事项: 1.web.config里需要配置2个地方 <httpHandlers>      <remove verb ...

  2. oracle数据库高级应用之《自动生成指定表的insert,update,delete语句》

    /* * 多条记录连接成一条 * tableName 表名 * type 类型:可以是insert/update/select之一 */ create or replace function my_c ...

  3. ERROR Cannot determine the location of the VS Common Tools Folder

    参考:ERROR Cannot determine the location of the VS Common Tools Folder   http://blog.csdn.net/m3728975 ...

  4. 【leetcode】Word Search

    Word Search Given a 2D board and a word, find if the word exists in the grid. The word can be constr ...

  5. js控制精度的加减乘除:js浮点数计算问题

    //加法函数 function accAdd(arg1, arg2) { var r1, r2, m; try { r1 = arg1.toString().split(".")[ ...

  6. iOS CoreData relationship 中的inverse

    官方文档建议为每一个可以设置inverse的relationship设置一个inverse.目的是保持数据库的正确性.但是没有具体的说明. 我在stackoverflow中找到了一个是分好的答案,ht ...

  7. 《Java多线程核心技术》读书摘要

    Chapter1: 进程是操作系统管理的基本单元,线程是CPU调到的基本单元. 调用myThread.run()方法,JVM不会生成新的线程,myThread.start()方法调用两次JVM会报错. ...

  8. Effective C++ -----条款09:绝不在构造和析构过程中调用virtual函数

    在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层).

  9. shell变量判空几种方法

    强烈声明:关于对数字的比较以及判断是否为空 最好在外层添加""引起来,这样可以避免空与其他字符比较时报错的问题. 1. 变量通过" "引号引起来 #!/bin/ ...

  10. nyoj298_点的变换_错误

    点的变换 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 平面上有不超过10000个点,坐标都是已知的,现在可能对所有的点做以下几种操作: 平移一定距离(M),相对X ...