8.25 Codeforces Round 827 (Div. 4)

A Sum

分析: 判断三个数是否存在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));//内部要带类型!

C Stripes

分析:

看清题目意思 只有横排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

E Scuza

分析:二分+前缀和 暴力会超时,可以用二分,构建两个数组,一个是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;
}

F Smaller

分析: 每次对字符串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认真补题!及时回看!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值