8.12 div3+洛谷算法1-4(递推与递归)

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开始!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值