div3-1
Cipher Shifer
一开始没有理解添加一个我们补充的字符是什么意思,根据样例解释:
(1)如果我们没有添加字符,则这个字符后面会添加一个他自己
(2)如果添加了字符,那对于第一个字符后面会只补充他自己,对于下一个字符会添加包含这个字符的前面所有的字符
//直接根据样例找规律即可,稍微参考题意,没必要太纠结题意
Binary Cafe
//重点:
1.看到2^i 敏感任何数可以用它来表示 表示选不选!(且不会多次购买同一个)
对于某个数,选的个数就是n+1(也就是二进制表示的总共个数0~n)
2.不会存在少选一些比较小的数 而凑出一个更加大的数 因为二进制,更大的数只会比这些小的数的和大 这种情况 1110 和 0011 在算 n+1时可被包括
3.对于不能选全部:利用 min 性质
ans=2^k; ans=min(n+1,2^k); 即对于每个甜点选与不选(2^k)
由于也就是两种情况 所以直接取min
Ski Resort
很简单 遍历一遍,符合情况的加起来
Wooden Toy Festival
答案具有单调性 二分答案 整理一下对于问题我们要运用的算法思路先..后..
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
using namespace std;
#define int long long
//减少准备时间
int t, n;
const int N = 2e5 + 10;
int a[N];
//二分 找出区间内三个点 能够覆盖整个区间即满足题意 找最小覆盖区间的距离
//找最小距离:二分距离! 找出三段2*d的长度可以覆盖全部区间的最小d 也就是最后的答案!
//对于两个点间的距离>2*x的处理:以a1到a2距离正常 a2到a3距离过大
//在循环处理时对于a1~a3会cnt++ 对于a2~a3会cnt++ 最后如果cnt==2满足(执行r=mid)
//他是一步步慢慢减小的 不会存在直接跳过较大距离的情况!
bool check(int x) {
int cnt = 0;
int p = 1;
for (int i = 2; i <= n; i++) {
if (a[p] + 2 * x < a[i]) {
p = i;
cnt++;
}
}
return cnt < 3;
//这里为什么返回的是<3???
//因为cnt==3很有可能就是答案了 此时不能直接取r=mid 会损失很多
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//cin >> t;
int t = 1;
while (t--) {
cin >> n;
set<int> s;
for (int i = 1; i <= n; i++) {
cin >> a[i];
s.insert(a[i]); //去重!
}
if (s.size() <= 3) {
cout << 0 << endl;
continue;
}
sort(a + 1, a + 1 + n);
int l = 0, r = a[n];//二分距离 这里l和r均指值 而不是指下标
while (l < r) {
//cout << l << " " << r << "nice" << endl;
int mid = (l + r) >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
cout << l << endl;
}
return 0;
}
div3-2
Musical Puzzle
字符串可以直接加上字符:需要先定义再加!string s1; s1+=a[i]; s1+=a[i+1];
注意定义容器如果为了防止忘记清空,可以直接在solve函数中定义!
Restore the Weather
因为相差的值是恒定的,且题目保证一定可以进行配对,所以直接将a[i]和b[i]排序,对应输出即可!
//重点!
1.只记录下标(将小的数值的下标放在前面 进行统一对应!)
idx1[i]=i; idx2[i]=i;
比较函数cmp
bool cmp1(int i,int j){
return a[i]<a[j];
}
2.将数值大小进行一一对应后 直接对应下标赋值!
a[idx1[i]]=b[idx2[i]];
//要敢写 只要把思路实现了就行!
Vlad Building Beautiful Array
//结论:一个数只有减去奇数,他的奇偶性才会发生改变
//奇数-奇数=偶数 偶数-奇数=奇数
//奇数-偶数=奇数 偶数-偶数=偶数
//偶数就是由偶数个奇数组成 奇数就是由奇数个奇数组成
//判断:
1.每个数大于0 则全为奇数||全为偶数 可以
2.如果对于偶数没有比他小的奇数给他减,那么他的奇偶性不能改变
注意vector判断每次是从0开始!