代码源每日一题 div1 (301-307)

代码源每日一题 2022-5-9 数学 - 题目 - Daimayuan Online Judge 给定整数 n,胖教授想将1∼n这nn个数字分成两组,每一组至少有一个数,并且使得两组数字的和的最大公约数最大,请输出最大的最大公约数。 输入格式: 一行输入一个n。 输出格式: 输出一个最大的公约数。 数据: 对于20%的数据,保证n≤100。 对于100的数据,保证n≤1e9。 输入样例: 6 输出样例 7 好了,题目已经看完了,然后就是解题了。 1:我们先来转化题意因为题目是1~n分成俩组数据,那1~. 阅读详情

代码源每日一题 div1 (301-307)

连续子序列

[Link](连续子序列 - 题目 - Daimayuan Online Judge)

思路

  • d p dp dp

​ 暴力的来设 f i : 以 i 结 尾 的 最 长 子 序 列 f_i:以i结尾的最长子序列 fi​:以i结尾的最长子序列,对于一个 a i a_i ai​我们想看 f a i − 1 f_{a_i-1} fai​−1​是否存在,存在就接到后面,设最长为 m x mx mx,我们 d p dp dp完从前往后遍历 f f f,对于第一个 f i = m x f_i=mx fi​=mx的位置一定是字典序最小的。由于值域太大我们不可能开一个数组来存,因此开个 m a p map map来搞一下即可。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 1e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
int a[N];
map<int, int> f;
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n;
    int mx = 0;
    for (int i = 1; i <= n; i ++) {
        int x; cin >> x;
        f[x] = f[x - 1] + 1;
        mx = max(mx, f[x]);
    }    
    for (auto it : f) 
        if (it.second == mx) {
            cout << mx << '\n';
            for (int i = it.first - mx + 1; i <= it.first; i ++)
                cout << i << ' ';
            cout << '\n';
            return 0;
        }
    return 0;
}

工作安排

[Link](工作安排 - 题目 - Daimayuan Online Judge)

思路

  • 贪心

​ 将任务按时间排序,对于每个任务,如果当前时间不够,若前面某个点的收益小于当前点的收益,我们就将用当前点把那个点替换掉即可,维护前面选的权值最小的值可以用一个优先队列来做。

小根堆要重载大于号。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 1e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
PII a[N];
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i ++) cin >> a[i].y >> a[i].x;
    sort(a + 1, a + 1 + n,[&](PII a, PII b) {
        return a.y < b.y;
    });
    priority_queue<PII, vector<PII>, greater<PII>> pq;
    for (int i = 1; i <= n; i ++) {
        if (a[i].y <= 0) continue ;
        if (pq.size() < a[i].y) pq.push(a[i]);
        else if (pq.top().x < a[i].x) {
            pq.pop();
            pq.push(a[i]);
        }        
    }
    LL res = 0;
    while (pq.size()) {
        res += pq.top().first;
        pq.pop();
    }

    cout << res << '\n';
    return 0;
}

三角果计数

[Link](三角果计数 - 题目 - Daimayuan Online Judge)

思路

  • 树形 d p dp dp

​ 发现当三个点在树的一条路径上无解,其他情况均有解,由于不在一条路径上因此必然存在一个中间结点分别与这些点相连,假设这个点和其他三个点相连的边权分别为 a , b , c a,b,c a,b,c,则 a + b + b + c > a + c a+b+b+c>a+c a+b+b+c>a+c,证明与权值路径权值无关了。

​ 接下来考虑如何计数,我们可以这样来划分方案以点 u u u为中间点的方案数,这样的方案数由两部分构成:

  1. u u u的两个不同的子树各选一个,非 u u u的子树里选一个这样是不会构成一条路径的
  2. u u u的三个不同的子树各选一个,这样也不会构成一条路径

​ 设 s z [ u ] : 以 u 为 根 的 子 树 的 节 点 数 sz[u]:以u为根的子树的节点数 sz[u]:以u为根的子树的节点数,对于方案一我们要求 非 u 子 树 节 点 数 × ∑ i = 1 n ∑ j = i + 1 n s z [ i ] × s z [ j ] 非u子树节点数\times\sum_{i=1}^n\sum_{j=i+1}^nsz[i]\times sz[j] 非u子树节点数×∑i=1n​∑j=i+1n​sz[i]×sz[j],后面的连成可以优化成 O ( n ) O(n) O(n),因为 ( a + b ) 2 = a 2 + b 2 + 2 a b → a b = ( a + b ) 2 − ( a 2 + b 2 ) 2 (a+b)^2=a^2+b^2+2ab\to ab = \frac{(a+b)^2-(a^2+b^2)}{2} (a+b)2=a2+b2+2ab→ab=2(a+b)2−(a2+b2)​,推广到 n n n个变量,我们可以 O ( n ) O(n) O(n)的求 ( a + b ) 2 (a+b)^2 (a+b)2和 a 2 + b 2 a^2+b^2 a2+b2,同理方案二我们要求 ∑ i = 1 i = n ∑ j = i + 1 j = n ∑ k = j + 1 k = n s z [ i ] × s z [ j ] × s z [ k ] \sum_{i=1}^{i=n}\sum_{j=i+1}^{j=n}\sum_{k=j+1}^{k=n}sz[i]\times sz[j]\times sz[k] ∑i=1i=n​∑j=i+1j=n​∑k=j+1k=n​sz[i]×sz[j]×sz[k],这个通过式子也可以变形到 O ( n ) O(n) O(n),因此直接一个 d f s dfs dfs即可。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 2e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
int a[N];
LL sz[N];
LL res;
LL clac1(vector<int>&ve, int u) {
    if (ve.size() < 2) return 0;
    LL sum1 = 0, sum2 = 0;
    for (auto v : ve) sum1 += sz[v], sum2 += sz[v] * sz[v];
    return (LL)(n - sz[u]) * (sum1 * sum1 - sum2) / 2;
}
LL clac2(vector<int>&ve) {
    if (ve.size() < 3) return 0;
    LL sum1 = 0, sum2 = 0, sum = 0;
    for (auto v : ve) sum += sz[v];
    for (auto v : ve) sum1 += sz[v] * sz[v] * sz[v], sum2 += 3 * sz[v] * sz[v] * (sum - sz[v]);

    return (sum * sum * sum - sum1 - sum2) / 6;
}
void dfs(int u, int fa) {
    vector<int> ve;
    sz[u] = 1;
    for (int i = h[u]; ~i; i = ne[i]) {
        int j = e[i];
        if (j == fa) continue ;
        dfs(j, u);
        sz[u] += sz[j];
        ve.push_back(j);
    }
    res += clac1(ve, u);
    res += clac2(ve);
}
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n;
    memset(h, -1, sizeof h);
    for (int i = 1; i < n; i ++) {
        int x, y, z; cin >> x >> y >> z;
        add(x, y, z), add(y, x, z);
    }
    dfs(1, -1);
    cout << res << '\n';
    return 0;
} 
  • 数学

​ 如果将当前点 u u u去除掉我们可以得到好几颗子树,问题转化为从这些树中选三棵树每个每棵树选一个结点,设每个树的节点数为 s z [ i ] sz[i] sz[i],等价于要求 ∑ i = 1 i = n ∑ j = i + 1 j = n ∑ k = j + 1 k = n s z [ i ] × s z [ j ] × s z [ k ] \sum_{i=1}^{i=n}\sum_{j=i+1}^{j=n}\sum_{k=j+1}^{k=n}sz[i]\times sz[j]\times sz[k] ∑i=1i=n​∑j=i+1j=n​∑k=j+1k=n​sz[i]×sz[j]×sz[k],优化一下这个式子,我们可以枚举中间点 j j j对于每一个 j j j我们等价于求 ( ∑ i = 1 i = j − 1 s z [ i ] ) × s z [ j ] × ( ∑ k = j + 1 k = n s z [ k ] ) (\sum_{i=1}^{i=j-1}sz[i])\times sz[j]\times (\sum_{k=j+1}^{k=n}sz[k]) (∑i=1i=j−1​sz[i])×sz[j]×(∑k=j+1k=n​sz[k]),也就是我们可以枚举其中一个点,然后保证这个点前面的递增,后面的递减即可,也就是等价于我们求到了 u u u这个点对于已经出现的点作为左半部分,当前枚举的作为 j j j,未枚举到的作为右半部分,因此就可以 O ( n ) O(n) O(n)的求了。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 1e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
int a[N];
LL sz[N];
LL res;
void dfs(int u, int fa) {
    sz[u] = 1;    
    for (int i = h[u]; ~i; i = ne[i]) {
        int j = e[i];
        if (j == fa) continue ;
        dfs(j, u);
        res += (sz[u] - 1) * sz[j] * (n - sz[u] - sz[j]);
        sz[u] += sz[j];
    }
}
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    memset(h, -1, sizeof h);
    cin >> n;
    for (int i = 1; i < n; i ++) {
        int x, y, z; cin >> x >> y >> z;
        add(x, y), add(y, x);
    }
    dfs(1, -1);
    cout << res << '\n';
    return 0;
}

整齐的数组2

[Link](整齐的数组2 - 题目 - Daimayuan Online Judge)

思路

  • 枚举,数论

​ 首先给原数组排个序,如果有大于等于一般的数都相同就是无解。

​ 首先如果给你一个 k k k,怎么判断是否和法,对于两个数 a i + x k = a j + y k → a i ≡ a j ( m o d   k ) a_i+xk=a_j+yk\to a_i\equiv a_j(mod\ k) ai​+xk=aj​+yk→ai​≡aj​(mod k),因此可以开一个 m a p map map,统计出这 n n n个数 m o d   k mod\ k mod k的值然后遍历 m a p map map看是否存在 ≥ n / 2 \ge n/2 ≥n/2的值。

​ 那么怎么枚举我们的 k k k呢,由于我们要让一半的数相同,假设 a i > a j a_i>a_j ai​>aj​那么当 a i a_i ai​减到等于 a j a_j aj​的时候就不需要再减了,设 d = a i − a j d=a_i-a_j d=ai​−aj​,我们可以枚举 d d d的所有约数,对于大于 d d d的数不可能让他俩相同所以没必要枚举,对于非 d d d的约数 a i a_i ai​一定不可能减到 a j a_j aj​我们也不需要枚举了。假设最优解为 k 1 k_1 k1​,那么一定是某个 a i a_i ai​变到了 a j a_j aj​因此一定可以枚举到。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 1e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
int a[N];
int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
bool check(int x) {
    map<int, int> mp;
    for (int i = 1; i <= n; i ++) mp[(a[i] % x + x) % x] ++;
    for (auto it : mp)
        if (it.second >= n / 2) return true;
    return false;
}
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int T;
    cin >> T;
    while (T -- ) {
        cin >> n;
        for (int i = 1; i <= n; i ++) cin >> a[i];
        sort(a + 1, a + 1 + n);
        bool ok = false;
        for(int i = 1; i <= n; i ++) {
            int j = i;
            while (j <= n && a[j] == a[i]) j ++;
            if (j - i >= n / 2) {
                ok = true;
                break;
            }
            i = j - 1;
        }

        if (ok) {
            cout << -1 << '\n';
            continue ;
        }

        int res = 1;
        for (int i = 1; i <= n; i ++)
            for (int j = i + 1; j <= n; j ++) {
                int d = abs(a[j] - a[i]);
                for (int k = 1; k <= d / k; k ++) {
                    if (d % k == 0) {
                        if (check(k)) res = max(res, k);
                        if (check(d / k)) res = max(res, d / k);
                    }
                }
            }

        cout << res << '\n';
    }
    return 0;
}

三进制循环

思路

  • 树形 d p dp dp

​ 处理出来以每个点为子树的顺序和逆序的最长长度,然后 d p dp dp判断当前点和父节点的关系,找到当前点出去和进来的最长长度相加即可。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 5e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
int a[N];
int d[N], p[N];
void dfs(int u, int fa) {
    d[u] = p[u] = 1;    
    for (int i = h[u]; ~i; i = ne[i]) {
        int j = e[i];
        if (j == fa) continue ;
        dfs(j, u);
        if ((a[j] + 1) % 3 == a[u]) p[u] = max(p[u], p[j] + 1);
        if ((a[u] + 1) % 3 == a[j]) d[u] = max(d[u], d[j] + 1);
    }
}
int res;
void dp(int u, int fa) {
    if (fa == -1) res = max(res, d[u] + p[u] - 1);
    else if ((a[u] + 1) % 3 == a[fa]) res = max(res, p[u] + max(d[u], d[fa] + 1) - 1);
    else if ((a[fa] + 1) % 3 == a[u]) res = max(res, d[u] + max(p[u], p[fa] + 1) - 1);
    else res = max(res, d[u] + p[u] - 1);
    for (int i = h[u]; ~i; i = ne[i]) {
        int j = e[i];
        if (j == fa) continue ;
        dp(j, u);
    }
}
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n;
    memset(h, -1, sizeof h);
    for (int i = 1; i < n; i ++) {
        int x, y; cin >> x >> y;
        add(x, y), add(y, x);
    }
    for (int i = 1; i <= n; i ++) cin >> a[i];
    dfs(1, -1);
    dp(1, -1);

    cout << res << '\n';
    return 0;
}

树上逆序对

[Link](树上逆序对 - 题目 - Daimayuan Online Judge)

思路

  • 离线,树状数组

​ 很显然模拟是行不通的,我们可以找出 k k k叉树的时候每个结点的情况对于结点 i i i它的子树对应的结点区间为 [ k ( i − 1 ) , k i + 1 ] [k(i-1),ki+1] [k(i−1),ki+1],那么这个点的贡献就是这些区间里值小于它的数的个数,我们可以将所有数的区间预处理出来,对于每个区间我们要求这个区间小于某个数的个数,这个可以用我们前边数数这道题的方法,离线树状数组来搞。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 2e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
int a[N];
PII b[N];
int res[N];
struct Node {
    int l, r, h, id;
    bool operator<(Node t)const {
        return h < t.h;
    }
}q[4000000];
int tr[N];
int lowbit(int x) {
    return x & -x;
}
void add(int x) {
    for (; x <= n; x += lowbit(x)) tr[x] ++;
}
int sum(int x) {
    int res = 0;
    for (; x; x -= lowbit(x)) res += tr[x];
    return res;
}
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i ++) cin >> a[i], b[i] = {a[i], i};
    sort(b + 1, b + 1 + n);
    for (int k = 1; k < n; k ++) {
        for (int i = 1; ; i ++) {
            int l = (i - 1) * k + 2, r = min(n, i * k + 1);
            if (l > n) break;
            q[++m] = {l, r, a[i], k};
        }
    }

    sort(q + 1, q + m + 1);
    int pos = 1;
    for (int i = 1; i <= m; i ++) {
        while (pos <= n && q[i].h > b[pos].x) add(b[pos ++].y);
        res[q[i].id] += sum(q[i].r) - sum(q[i].l - 1);
    }

    for (int i = 1; i < n; i ++)
        cout << res[i] << ' ';
    
    
    return 0;
}

约分

[link](约分 - 题目 - Daimayuan Online Judge)

思路

​ 二进制暴力枚举分子删除哪些位,直接根据最简比搞出对应的分母,判断当前分母是否合法,即是否符合删除次数,是否可以由原数删除得到。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 1e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
LL a, b;
vector<int> get(LL x) {
    vector<int> res;
    while (x) {
        res.push_back(x % 10);
        x /= 10;
    }
    return res;
}
LL gcd(LL a, LL b) {
    return b ? gcd(b, a % b) : a;
}
int cnt[10];
int main() {
    ios::sync_with_stdio(false), cin.tie(0);   
    cin >> a >> b;
    vector<int> numa = get(a), numb = get(b);
    LL d =gcd(a, b), p = a / d, q = b / d;

    for (int j = 1; j < 1 << numa.size(); j ++) {
        for (int i = 0; i < 10; i ++) cnt[i] = 0;
        LL fz = 0, fm;
        for (int i = numa.size() - 1; i >= 0; i --)
            if (j >> i & 1) fz = fz * 10 + numa[i];
            else cnt[numa[i]] ++;
        
        if (!fz || fz % p) continue ;
        fm = fz / p * q;        
        
        for (int i = 0; i < numb.size(); i ++)
            if (fm % 10 == numb[i]) fm /= 10;
            else cnt[numb[i]] --;
        bool ok = false;
        for (int i = 0; i < 10; i ++)
            if (cnt[i]) {
                ok = true;
                break;
            }
        if (ok) continue ;        
        if (a > fz) a = fz, b = fz / p * q;
    }

    cout << a << ' ' << b << '\n';
    return 0;
}
问题每日:每日一题 立即下载

相关推荐

《算法第四版》学习心得一——怎么学算法

 一、算法的两个核心 算法的核心内容实际上有两个: 算法的概念和思路。 算法的编程实现。 两者相互关联影响,缺一不可。 不理解基本概念和思路,就算把实现代码背下来,也无济于事,因为脑袋里依然是一片模糊。理解了概念和思路,不去用代码实现,脑袋里有的只是概念,无法根据真实需求实现解决方案。 二、学算法需要什么基础 首先,必须要有一定的编程语言基础,要理解语言中最基本的概念:数据类型,类,成...

illikang的博客 3909

代码源每日一题Div.1 (301~307)

难道说觉得姐姐要被抢走了吗?不会抢的。姐姐是创太的,哥哥也是创太的哥哥,不会抢走创太的「姐姐」,但能把「京子」给我吗? ——《堀与宫村》宫村伊澄

xhyu61的博客 549

防雷防浪涌电路设计

通信线路或者电源线路通常会铺设到户外,一旦线路铺到户外后,就需要考虑防雷的问题了,那么怎么设计保护电路,能够防止雷电等浪涌对电路的破坏呢?

manhuami2007的博客 1万+

代码源题目

目录 1.快快变大 思路 代码 2.饿饿 饭饭2​​​​​​​ 思路 代码 3.子串分值和​​​​​​​ 思路 代码 4.蒟蒻​​​​​​​ 思路 代码 5.锦标赛​​​​​​​ 思路 代码 6.可重排列​​​​​​​ 思路 代码 7.进制转换​​​​​​​ 思路 代码 8.循环子串​​​​​​​ 思路 代码 9.饿饿 饭饭之暑假大狂欢 思路 代码 10.RSA​​​​​​​ 思路 代码 1.快快变大​​​​​​​

qq_63988478的博客 857

目标检测技术的发展:从R-CNN、YOLO到DETR、DINO

OV-DINO的出现标志着在开放域目标检测领域的重大进步,其在处理未见过的物体类别时的能力得到了显著提升。这项技术对于需要适应未知或变化环境的应用具有重要意义,如自动驾驶、机器人视觉、安防监控等。

DeepAIedu的博客 2633

国产操作系统替换方案:3个避坑指南

坑核心误区避坑核心原则关键动作坑一:选型只看信创信创目录=唯一标准兼容性优先,信创是约束三维评估(兼容性+信创+生态),分场景选型坑二:迁移只管能跑功能能跑=迁移成功性能确认+运维回归适配-压测-回归三阶段,基线对比坑三:不防二次迁移解决停服=完成任务一步到位,两级兼容信创路线优先,双轨制发布,终态规划。

weixin_43524706的博客 299

代码源每日一题Div.1 (601-607)

想做的事最·优·先! ——《Lycoris Recoil》锦木千束

xhyu61的博客 443

apache 403错误 Forbidden解决方法

当网页打开提示以下错误时,即出现了403错误。 Forbidden You don't have permission to access / on this server. 403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。通常情况可能(但不限于此)的原因有: 原因1:apache配置文件中没有对站点目录的权限许可,这通...

lmseo5hy的博客 1499

代码源每日一题 div1(101-109)

代码源每日一题 二分答案 [Link](二分答案 - 题目 - Daimayuan Online Judge) 思路 二分 ​ 找最小值最大,很明显的二分,二分答案,O(n)O(n)O(n)检查答案是否合法。 Code #include <bits/stdc++.h> #define x first #define y second #define debug(x) cout<<#x<<":"<<x<<endl; using namespace

a12377978的博客 2988

华为od统一考试B卷【宜居星球改造计划】Java&Go 实现

XXX年,人类通过对火星的大气进行宜居改造分析,使得火星已在理论上具备人类宜居的条件,由于技术原因,无法一次性将火星大气全部改造,只能通过局部处理形式,假设将火星待改造的区域为row * column的网格每个网格有3个值,宜居区、可改造区、死亡区,使用YES、NO、NA代替,YES表示该网格已经完成大气改造,NO表示该网格未进行改造,后期可进行改造,NA表示死亡区,不作为判断是否改造完成的宜居,无法穿过 初始化下,该区域可能存在多个宜居区,并且每个宜居区能同时在每个太阳日单位向上下左右四个方向的相邻格子进

MISAYAONE的博客 1万+

基于上下文的 Listwise 重排模型(一):miRNN

2018年阿里团队提出的miRNN(Mutual Influence aware RNN)模型,首次将电商搜索重排建模为全局优化问题,通过RNN捕捉商品序列的相互影响,结合Beam Search生成最优排序,在淘宝搜索中实现GMV(商品交易总额)提升5%的突破。本文将结合论文细节与通俗案例,拆解这一工业级重排框架的核心逻辑。

进一步有进一步的欢喜~ 1918

代码源每日一题 #618. 选数2

代码源每日一题 Div1 选数2 蒟蒻第一次写博客,欢迎批评指正。

m0_58620783的博客 245

直击高频编程考点:字符串知识及经典算法题总结

字符串相关基本练习题总结(最长公共子串、最长回文子串、最长无重复字符子串、最小覆盖子串、字符串相乘、中文数字表达转实际数字格式等)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

【代码源】每日一题 国家铁路

代码源 每日一题 国家铁路 二维前缀最小值

m0_63658130的博客 809

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【代码源每日一题Div1】106.选数

代码源OJ每日一题Div1题解:106.选数

Wmiracle的博客 474

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

代码源每日一题#456. 选数

抽屉原理+前缀和

R的博客 379

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

代码源每日一题div1 Ayoub‘s function

Daimayuan Online Judge 思路:思维 我们从问题的反面考虑,就是要求所有的子串减去只含000的子串,那问题转化成如何让只含000的子串尽可能的少,结论是将111尽可能的均匀的分布在这个字符串中 显然我们有mmm个111就会分割出m+1m+1m+1个只含000的区间,那我们只要用总的子串个数减去这些只含000的区间的子串即可 一个长度为lll的字符串的子串个数为:l∗(l+1)/2l*(l+1)/2l∗(l+1)/2 现在我们来证明一下这个结论,为了方便我们只考虑整除的情况,即这些111划

qq_53287227的博客 338

代码源每日一题 div1 (401-407)

代码源每日一题 div1 (401-407) 蜗蜗的数列 [Link](蜗蜗的数列 - 题目 - Daimayuan Online Judge) 思路 差分 ​ 首先ci=ai−bic_i=a_i-b_ici​=ai​−bi​,等价于让我们求操作后cic_ici​均为零。对于区间操作我们倾向于改变成单点操作,这样复杂度就降下来了,观察斐波那契数列fi=fi−1+fi−2f_i=f_{i-1}+f_{i-2}fi​=fi−1​+fi−2​,每一项与前两项有关,我们设di=ci−ci−1−ci−2d_i=c

a12377978的博客 792

代码源每日一题Div2 101 特殊的正方形(代码源每日一题)

原题 简单图形打印,我写的太复杂了 #include<bits/stdc++.h> using namespace std; const int N = 110; int n; int main() { cin>>n; for(int i = 1; i <= n; i ++ ){ for(int j = 1; j <= n; j ++ ){ if(j <= n / 2 && i <= n / 2){ if(j &g

qiaodxs的博客 663

代码源每日一题 div1 #709. 最大权值划分

最大权值划分 大概题目意思是给你一个数组,你需要把它划分为连续的一些子数组,使得每个子数组的max-min最小。 思路 第一眼的时候没啥思路,直接想了个O(n2)O(n^2)O(n2)的做法,也就是枚举最后一个子数组划分到哪里,也不懂咋优化。 正解 观察到最大减最小(极差问题),等价于给一个子数组里面的两个数字,一个给一个+号,一个给一个-号,成对赋予了这些符号后,整个数组的极差最大。 那么可以先不考虑怎么划分,想象最优解,数组中的正负号形态肯定也是像上面所说的那样。即..+.....−..−...+...

灯灯登登的博客 361

Daimayuan Online Judge 序列维护

在数组中间插入用vector。vector的详细用法。begin()+x 是在0后面又数x个数。

qq_51690312的博客 840

代码源每日一题 2022 - 5 - 11

题目描述: huaji有一个 01 序列,每次可以对其中的某一位取反(0变1,1变0)。 求最少翻转其中的几位可以使得该序列变为非递减序列。 输入格式: 第一行输入一个整数 nn (1≤n≤1e6)。 第二行输入一个长度为 nn 的且仅包含 0 和 1 的字符串。 输出格式: 输出一个整数,为该序列变为非递减序列的最少操作次数。 样例输入: 6 010110 样例输出: 2 本题较易获得的一种思路,暴力求解,我们知道结果无论如何都是一个前面为0后面为1的序列,所以我们只需要列出所

qq_56507560的博客 366

代码源每日一题Div2

101 特殊的正方形 按照题意模拟即可,注意判断奇偶的情况下 #include<bits/stdc++.h> #define ll long long using namespace std; char mp[104][104]; void solve(){ int n; cin >> n; memset(mp,'.',sizeof mp); int res = n; int l = 1, r = n; int cnt = 1; while(l &

wxhinms的博客 1019

代码源每日一题div1 区间和

Daimayuan Online Judge 思路:构造图+bfs 告诉我们LiL_iLi​到RiR_iRi​连续元素的区间和,可以转换成Li−1L_i-1Li​−1到RiR_iRi​两点之间有条通路,那么问题转化成是否能找到一条通路从000走到nnn,bfsbfsbfs一遍即可 #include <bits/stdc++.h> using namespace std; #define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);

qq_53287227的博客 413

代码源每日一题div1 体育节

Daimayuan Online Judge 思路:区间dp 因为可以随便安排参赛人的顺序,显然我们把数组直接排序是更优的做法 定义dp[i][j]dp[i][j]dp[i][j]为区间[i,j][i,j][i,j]中最小的答案,答案即为dp[1][n]dp[1][n]dp[1][n] 而一个区间[i,j][i,j][i,j]可以由区间[i+1,j][i+1,j][i+1,j]添上一个a[i]a[i]a[i]得到或者由区间[i,j−1][i,j-1][i,j−1]添上一个a[j]a[j]a[j]得到 由于数

qq_53287227的博客 255

每日一练代码题 ------------2020-04-21

欢迎大家关注我的公众号 【软件测试小助手】 分享我是如何学习测试的 该题,来自我微信收藏了好久的一道代码题 下面的结果分别是? public class Test{ static String str; public static void main(String[] args) { static String str; System.out.println(str); } ...

weixin_38961318的博客 352
上一篇: 代码源每日一题 div1 (201-207)
下一篇: 代码源每日一题 div1 (401-407)
枉玊
博客等级 码龄6年 73粉丝 171原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值