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的行列,感动~.虽然最 ...
随机推荐
- Resizing the disk space on Ubuntu Server VMs running on VMware ESXi 5
from: http://www.joomlaworks.net/blog/item/168-resizing-the-disk-space-on-ubuntu-server-vms-running- ...
- list<T>与ObservableCollection<T>
list<T>与ObservableCollection<T>的用法基本上是一样的.区别: list<T>: 当T继承于INotifyPropertyChanged ...
- oracle,mybatis主键自增长
<insert id="insert" parameterType="resource"> <selectKey resultType=&qu ...
- ACM/ICPC 之 网络流入门-Ford Fulkerson与SAP算法(POJ1149-POJ1273)
第一题:按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47M ...
- java 入门 第二季3
1.继承 1.java是单继承的,一个子类只有一个父类 父类,基类 子类,派生类 2.继承的好处:子类拥有父类的所有属性和方法,属性的修饰符不能是private 3.语法规则: class 子类 ex ...
- C#在类中用调用Form的方法
class 你的类 { private Form1 frm; //构造函数 public 你的类( Form1 form) { frm = form; } //调用form方法 private voi ...
- 【python】入门学习(四)
函数: 定义函数 #area.py from math import pi def area(radius): """Return the area of a circl ...
- 【QT】C++ GUI Qt4 学习笔记4
感觉这本书的顺序设计的太不合理了,出现的最多的一句话就是后面会讲.按照使用的顺序讲不行吗?搞得代码都运行不了. 我决定先直接跳到73页,子类化QTableWidgetItem这一节.因为前面功能的实现 ...
- [Android Pro] AAR and JAR
svn status svn log --limit 3 > RELEASE_NOTE.txt cat RELEASE_NOTE.txt pwd project_name_prefix=&quo ...
- September 16th 2016 Week 38th Friday
All the treasures of the earth would not bring back one lost moment. 机会失去不再来,千贯万贯难赎回. Cherish your h ...