牛客小白月赛39
作者:互联网
比赛链接:
https://ac.nowcoder.com/acm/contest/11216
A.憧憬
题目大意:
给了 \(n\) 个向量及一个目标向量的起点和终点坐标,判断有没有两个向量相加得到的向量与目标向量平行。
思路:
暴力枚举任意两个向量的组合,然后通过向量平行的性质 \(x_1 * y_2 - x_2 * y_1 = 0\) 去判断一下就行。
代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 1e3 + 10;
LL n, x[N], y[N], a, b, t1, t2, t3, t4;
int main(){
cin >> n;
for (int i = 1; i <= n; ++ i){
cin >> t1 >> t2 >> t3 >> t4;
x[i] = t3 - t1;
y[i] = t4 - t2;
}
cin >> t1 >> t2 >> t3 >> t4;
a = t3 - t1;
b = t4 - t2;
for (int i = 1; i <= n; ++ i){
for (int j = i + 1; j <= n; ++ j){
LL p = x[i] + x[j], q = y[i] + y[j];
if (p * b - q * a == 0){
cout << "YES\n";
return 0;
}
}
}
cout << "NO\n";
return 0;
}
B.欢欣
题目大意:
在给定字符串中找到 "QAQ" 这个字符串。
思路:
调用 find() 函数就行。
代码:
#include <bits/stdc++.h>
using namespace std;
string s, t = "QAQ";
int main(){
cin >> s;
cout << s.find(t) + 1 << "\n";
return 0;
}
E.迷惘
题目大意:
给了 \(n\) 个数字 \(x\),将它转为二进制后进行翻转,然后去掉前导 0,再将它转回十进制,计算这 \(n\) 个数字进行这个操作后的和。
思路:
按题意模拟就行。
代码:
#include <bits/stdc++.h>
using namespace std;
#define IOS() ios::sync_with_stdio(false);cin.tie(0);
#define LL long long
LL ans, n, x;
int main(){
IOS();
cin >> n;
for (int i = 1; i <= n; ++ i){
cin >> x;
vector <LL> v;
while (x > 0){
v.push_back(x & 1);
x >>= 1;
}
reverse(v.begin(), v.end());
LL p = 1, t = 0;
for (auto x : v){
t += x * p;
p <<= 1;
}
ans += t;
}
cout << ans << "\n";
return 0;
}
H.终别
题目大意:
\(n\) 个怪兽,每个怪兽有 \(a_i\) 点血,可以发出斩击,对连续三个位置上的怪兽造成 1 点伤害,当怪兽血量 <= 0 的时候死亡,现在有一次使用魔法的机会,将连续的两个怪兽直接杀死,计算最少需要几次斩击才能将全部的怪兽杀死。
思路:
首先考虑没有魔法的情况下,需要几次斩击,明显的贪心,从右到左,当某个怪兽存活时,就斩击从这个位置开始的连续三个位置上的怪兽。
现在有了魔法,假设直接杀死第 \(i\) 位和第 \(i + 1\) 上的怪兽,那么问题又变回没有魔法的操作了,将 1 到 \(i - 1\) 和 \(i + 2\) 到 \(n\) 的怪兽斩杀。可以发现这是 O(\(n^2\)) 的操作,超时。
考虑怎么快速计算斩击次数,可以发现第 \(i\) 个位置上的斩击数和前一个位置上的斩击数有关。那么可以通过递推的操作,从前到后以及从后到前,两次预处理斩击数。这就将计算斩击数的操作变为了 O(1) 的时间复杂度。
代码:
#include <bits/stdc++.h>
using namespace std;
#define IOS() ios::sync_with_stdio(false);cin.tie(0);
#define LL long long
const int N = 1e6 + 10;
LL a[N], b[N], pre[N], suf[N], n, ans;
int main(){
IOS();
cin >> n;
for (int i = 1; i <= n; ++ i){
cin >> a[i];
b[i] = a[i];
}
for (int i = 1; i <= n; ++ i){
if (a[i] > 0){
pre[i] = pre[i - 1] + a[i];
a[i + 1] -= a[i];
a[i + 2] -= a[i];
a[i] = 0;
}
else
pre[i] = pre[i - 1];
}
for (int i = n; i >= 1; -- i){
if (b[i] > 0){
suf[i] = suf[i + 1] + b[i];
b[i - 1] -= b[i];
b[i - 2] -= b[i];
b[i] = 0;
}
else
suf[i] = suf[i + 1];
}
ans = pre[0] + suf[3];
for (int i = 2; i <= n - 1; ++ i)
ans = min(ans, pre[i - 1] + suf[i + 2]);
cout << ans << "\n";
return 0;
}
标签:怪兽,39,suf,int,LL,cin,long,牛客,小白月赛 来源: https://www.cnblogs.com/Hamine/p/16023428.html