ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

牛客小白月赛39

2022-03-18 20:35:00  阅读:337  来源: 互联网

标签:怪兽 39 suf int LL cin long 牛客 小白月赛


比赛链接:

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有