链接:https://ac.nowcoder.com/acm/contest/104637/A
来源:牛客网
A-小苯跑外卖
题目描述
君子爱财取之有道。小苯发现跑外卖居然可以三年挣钱 1.02×1e6元,于是赶快注册也成为了外卖小哥。
小苯发现自己平均跑一单外卖可以赚 x 元,于是,他给自己定下了目标:每天至少需要赚够 y 元。他想知道,自己每天至少需要跑几单,才能达成他定下的目标。请你帮他算一算吧。
输入描述:
在一行上输入两个正整数 x,y(1≦x≦5; 200≦y≦1e3),代表小苯平均跑一单外卖赚到的钱数、小苯每天至少要赚到的钱数。
输出描述:
输出一个正整数,表示小苯每天至少要跑的单数。
示例1
输入
复制2 400
2 400
输出
复制200
200
说明
跑 200 单外卖,赚 200×2=400 元,刚好达到目标。
示例2
输入
复制3 400
3 400
输出
复制134
134
说明
如果跑 133 单外卖,赚 133×3=399 元,还差 1 元才能达到目标。而跑 134 单外卖,赚 134×3=402 元,超过目标。所以,小苯至少要跑 134 单外卖。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int x,y;
cin>>x>>y;
if(y%x==0) cout<<y/x;
else cout<<y/x+1;
return 0;
}
B-小苯的区间删除
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
小苯有一个由 n个整数组成的数组 {a1,a2,…,an},他想要使得数组中的元素和最大。为此,小苯可以进行任意次以下操作(也可以不操作):
选择一个长度不超过 k 的区间 [l,r](1≦l≦r≦n; r−l+1≦k),将 al,al+1,...,ar这段元素删除,并将其余元素按照原有顺序前后拼接起来。换句话说,操作后数组变为:a1,a2,…,al−1,ar+1,…,an。
小苯想知道,在可以进行任意次上述操作的前提下,数组中的元素和最大可以变为多少。特别地,空数组的总和视为 0。
输入描述:
每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≦T≦103) 代表数据组数,每组测试数据描述如下: 第一行输入两个正整数 n,k(1≦k≦n≦2×105) 代表数组中的元素个数、操作的区间的长度上限。 第二行输入 n 个整数 a1,a2,…,an(−109≦ai≦109) 代表数组中的元素。 除此之外,保证单个测试文件的 n 之和不超过 3×1e5。
输出描述:
对于每组测试数据,新起一行。输出一个整数代表操作后数组的最大总和。
示例1
输入
2 5 2 1 2 -2 -3 4 4 4 1 1 1 1
输出
7 4
说明
对于第一组测试数据,删除区间 [3,4] 后,数组变为 {1,2,4},总和为 7。我们可以证明,这是操作能得到的最大总和。 对于第二组测试数据,数组中所有元素均为 1,因此不操作就是最优的。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
ll ans=0;
cin>>n>>k;
vector<int> v(n+5);
for(int i=0;i<n;i++){
cin>>v[i];
if(v[i]>0) ans+=v[i];
}
cout<<ans<<"\n";
}
return 0;
}
C-小苯的数字消除
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
小苯有一个长度为 n,仅由字符 ‘0’ 和 ‘1’ 构成的字符串 s。下标从 1 开始。
小苯认为 s 的长度过长,他希望用一些“消除”操作,将 s 的长度变得尽可能短。一次“消除”操作描述为:
如果存在这样的 i(1≦i<∣s∣)满足 si=si+1,那么小苯可以将 si,si+1 这两个字符消除,其余的字符按原有顺序拼接起来。换句话说,一次操作过后的字符串变为 s="s1s2⋯si−1si+2⋯s∣s∣"(其中,∣s∣ 用于表示字符串 s 的长度)。
小苯为了最小化 s 的长度,因此在开始“消除”操作之前,他可以进行一些“修改”操作。一次“修改”操作描述为:
选择任意一个位置上的字符,将其改为 ‘0’‘1’ 中的任意一种。
现在,小苯想知道,他至少需要先进行几次“修改”操作,才能使得存在这样一种“消除”操作的执行方案,使得 s 的长度不超过 1。请你帮他算一算吧。
输入描述:
每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≦T≦103)代表数据组数,每组测试数据描述如下: 第一行输入一个正整数 n(1≦n≦106)n 代表字符串 s 的长度。 第二行输入一个长度为 n,仅由字符 ‘0’\‘1’ 构成的字符串 sss。 除此之外,保证单个测试文件的 n 之和不超过 10^6。
输出描述:
对于每组测试数据,新起一行。输出一个整数,代表至少需要进行的“修改”操作的次数。
示例1
输入
2 7 0101110 4 0000
输出
2 0
思路
模拟stack就行,最后对剩下的元素除2操作就行。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int T;
cin >> T;
while (T--)
{
int n, k = 0;
string s;
stack<char> sta;
cin >> n >> s;
for (int i = 0; i < n; i++)
{
if (sta.size())
{
if (s[i] == sta.top())
{
sta.pop();
}
else
{
sta.push(s[i]);
}
}
else sta.push(s[i]);
}
if (!sta.size())
{
cout << 0 << "\n";
}
else
{
cout << sta.size() / 2 << "\n";
}
}
return 0;
}