分析: 判断三个数是否存在x+y=z的情况
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define int long long
int t, n, k;
const int N = 2e4 + 10;
void solve() {
int a, b, c;
cin >> a >> b >> c;
if ((a + b) == c || (a + c) == b || (a == (b + c))) cout << "YES" << endl;
else cout << "NO" << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
solve();
}
return 0;
}
B Increasing
分析: 先将数都存入 sort 最后判断是否有等于的情况!
用vector为什么是错的? 因为你申请空间过大,会存在值为0的情况 排序直接会将0放在前面,判断时为false
更正代码(vector)
void solve() {
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) cin >> v[i];
sort(v.begin(), v.end());
bool flag = true;
for (int i = 1; i < n; i++) {
if (v[i] == v[i - 1]) {
flag = false;
break;
}
}
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define int long long
int t, n, k;
const int N = 2e4 + 10;
int a[105];
void solve() {
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
bool flag = true;
for (int i = 1; i < n; i++) {
if (a[i] == a[i - 1]) {
flag = false;
//cout << "false" << i<< endl;
break;
}
}
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
solve();
}
return 0;
}
知识点:
c++之vector初始化指定大小容量
1.一维
vector<int> v(size);
vector<int> v;//这样size为0 不初始化容量会报错!
v.resize(size);//resize!!!
2.二维
//(外部size,内部size vector<int>(lsize,0))
vector<vector<int>> v(rsize,vector<int>(lsize,0));//内部要带类型!
分析:
看清题目意思 只有横排R 纵列B!直接判断横排R个数是否为8 不是输出B 是输出R
你可以每次只输入一个字符串来判断 不用一次性将一整个图输入!
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define int long long
int t, n;
//char g[10][10];
void solve() {
string s;
bool flag = false;
for (int i = 0; i < 8; i++) {
cin >> s;
int cnt = 0;
for (int j = 0; j < 8; j++) {
if (s[j] == 'R') cnt++;
}
if (cnt == 8) flag = true;
}
if (flag) cout << "R" << endl;
else cout << "B" << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
solve();
}
return 0;
}
D Coprime
分析:如果直接暴力 时间复杂度是O(2^n) 爆,所以贪心,将注意力放大每个数的值上去1000很小 所以每次记录某个数出现的最大的坐标,枚举1000*1000次 看这两个数是否存在和是否互质
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define int long long
int t, n;
const int N = 2e5 + 10;
//char g[10][10];
int a[N];
void solve() {
cin >> n;
map<int, bool> mp;
map<int, int> p;
for (int i = 1; i <= n; i++) {
cin >> a[i];
mp[a[i]] = 1;
p[a[i]] = i;//因为坐标是不断变大的 所以直接等于
}
int ans = 0;
for (int i = 1; i <= 1000; i++) {
for (int j = 1; j <= 1000; j++) {
if (mp[i] && mp[j] && __gcd(i, j)==1) {
ans = max(ans, p[i] + p[j]);
}
}
}
cout << ans << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
solve();
}
return 0;
}
知识点:
不要不舍得开 要存就开 能写就开 尽量往简单好写靠近!
两数互质:__gcd(x,y) ==1 即两数最大公约数为1
分析:二分+前缀和 暴力会超时,可以用二分,构建两个数组,一个是a[i],作为前缀和数组,一个是f[i]表示第i个台阶之前的高度最大的台阶,然后每次二分来查找k,因为尽可能走的更多,所以查找有边界,最后输出对应的前缀和。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define int long long
int t, n, q, k;
const int N = 2e5 + 10;
//char g[10][10];
int a[N];
void solve() {
cin >> n >> q;
vector<int> a(n + 5);//前缀和数组
vector<int> v(n + 5);//这个阶梯之前高度最大的阶梯
for (int i = 1; i <= n; i++) {
cin >> a[i];
v[i] = max(v[i - 1], a[i]);
a[i] += a[i - 1];
}
while (q--) {
cin >> k;
int l = 1, r = n;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (v[mid] <= k) l = mid;
else r = mid - 1;
}
if (v[l] <= k) cout << a[l] << " ";
else cout << 0 << " ";
}
cout << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
solve();
}
return 0;
}
分析: 每次对字符串s或t进行操作,判断是否按照题目要求字符串s小于t ,两种情况:
1.字符串t存在一个不为a的字符
2.t全为a s也全为a 但是s的长度小于t
完全不需要定义s和t!只用加上a的个数!
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define int long long
int t, n, q, k;
const int N = 2e5 + 10;
int a[N];
void solve() {
cin >> q;
bool othera = false, otherb = false;
int cnta = 0, cntb = 0;
while (q--) {
int d, k; string x; cin >> d >> k >> x;
for (auto c : x) {//此形式!c就相当于x中的每个元素!
if (d == 1) {
if (c != 'a') othera = 1;
else cnta += k;//每个字符a都要加这么多遍
}
else {
if (c != 'a') otherb = 1;
else cntb += k;
}
}
if (otherb) cout << "YES" << endl;
else if (!othera && cnta < cntb) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
solve();
}
return 0;
}
G Orray(没太搞明白)
只有前log2(maxval)个元素是重要的 因为在以最佳方式放置这些元素后,我们可以确定所有可以在前缀or中设置的位都已经设置好了。因此我们可以蛮力选择log2(maxval)次选择(如果一个元素在所有未使用的元素中提供了最大的新前缀or值,我们就选择添加该元素),然后只添加其余未使用的元素
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
//#define int long long
int t, n, q;
void solve() {
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
int cur = 0;
vector<bool> vis(n, false);
for (int i = 0; i < min(31, n); i++) {
int mx = 0, idx = -1;
for (int j = 0; j < n; j++) {
if (vis[j]) continue;
if ((cur | a[j]) > mx) {
mx = (cur | a[j]);
idx = j;
}
}
vis[idx] = true;
cout << a[idx] << " ";
cur |= a[idx];
}
for (int i = 0; i < n; i++) if (!vis[i])cout << a[i] << " ";
cout << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
solve();
}
return 0;
}
要坚持自己思考,认真vp认真补题!及时回看!