首页 > 其他分享 > 洛谷100题计划 (15/100)

洛谷100题计划 (15/100)

时间:2023-08-24 18:55:42浏览次数:46  
标签:洛谷 int cin find edge using 15 100 id

洛谷100题计划 (15/100)

P1094 [NOIP2007 普及组] 纪念品分组 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

要使得分组最少,其实就是要让一个大的和一个小的放一起,如果大的和小的一起放超过了\(w\),那大的就应该单独放,所以排完序之后,我们可以用双指针从两边寻找可以放一起的纪念品即可

#include<bits/stdc++.h>

using i64 = long long;

using namespace std;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int w, n;
    cin >> w >> n;
    vector<int> a(n);
    int ans = 0;
    for (auto &i : a) cin >> i;

    sort(a.begin(), a.end());

    for (int i = 0, j = n - 1; i <= j;) {
        if (a[j] + a[i] > w) {
            ans ++;
            j--;
        } else {
            ans++;
            j --, i ++;
        }
    }

    cout << ans << '\n';

    return 0;
}

P1102 A-B 数对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

考虑\(A- B=C\),如果直接暴力两重\(for\)循环\(\mathcal{O}(n^2)\)肯定是要超时的,我们稍微转换一下这个式子就可以得到\(A=B+C\),如果我们能知道\(B+C\)的个数(记为\(num_{B+C}\),\(A\)的个数(记为\(num_A\)),那么\(A=B+C\)的数对个数不就等于\(num_{B+C} \times num_A\)了吗,当然你也可以提前用一个数列把\(B+C\)算出来,不过我这里推荐用\(map\),\(map\)内置的\(find\)函数复杂度是\(\mathcal{O}(logn)\)的,且不用担心空间开太大的问题,这样总复杂度就是\(\mathcal{O}(nlogn)\)

#include<bits/stdc++.h>

using i64 = long long;

using namespace std;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    map<int, i64> mp;
    int c, m, n;
    cin >> n >> c;
    vector<int> a(n);
    for (int i = 0; i < n; i ++) {
        cin >> m;
        mp[m]++;
    }
    i64 ans = 0;
    for (auto [i, j] : mp) {
        if (mp.find(i + c) != mp.end()) {
            ans += j * mp[i + c];
        }
    }
    cout << ans << endl;

    return 0;
}

P1105 平台 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

惹,实话实说,被这题ex到了感觉是这题的描述不太清楚,看了半天讨论区才改对

首先就是,我是先记录四个信息,该平台序号(\(id\)),高度(\(H\)),左边界(\(L\))和右边界(\(R\)),然后按高度排序,高度相同的情况下一定要把大的排前面,,这样后面第一次往前找到的平台才会是序号较小的平台,剩下就是去找到对应的平台,然后从这个平台往前面找,我们要找的这个平台高度相同的可以直接跳过,找到之后直接退出

代码可能有一点长,但主要是理解那个思维

#include<bits/stdc++.h>

using i64 = long long;

using namespace std;

typedef pair<i64, i64> PII;

struct Node {
    int id, H, L, R;
    Node(int i, int h, int l, int r): id(i), H(h), L(l), R(r) {};
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<Node> a;
    for (int i = 1; i <= n; i ++) {
        int h, l, r;
        cin >> h >> l >> r;
        a.emplace_back(i, h, l, r);
    }

    sort(a.begin(), a.end(), [](Node x, Node y) {
        if (x.H == y.H) return x.id > y.id;
        return x.H < y.H;
    });

    for (int  i = 1; i <= n; i ++) {
        int pos = 0;
        for (int j = 0; j < n; j ++) {
            if (a[j].id == i) {
                pos = j;
                break;
            }
        }

        int ansL = 0, ansR = 0;
        for (int j = pos; j >= 0; j --) {
            if(a[j].H == a[pos].H) continue;
            if (a[pos].L > a[j].L && a[pos].L < a[j].R) {
                ansL = a[j].id;
                break;
            }
        }
        for (int j = pos; j >= 0; j --) {
            if(a[j].H == a[pos].H) continue;
            if (a[pos].R > a[j].L && a[pos].R < a[j].R) {
                ansR = a[j].id;
                break;
            }
        }
        cout << ansL << ' ' << ansR << '\n';
    }

    return 0;
}

P1111 修复公路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

以前写过的直接上代码了

采用并查集的思路,先把所有路按照时间的顺序排序,然后每建一条路就把两个村庄连起来,然后\(n-1\),当\(n=1\)时,说明所有的村庄都被一个村庄连起来,此时任意两个村庄都能通车,输出此时的时间即可

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int id[N];
int n, m, p;
struct Edge {
    int x, y, t;
} edge[N];
int find(int k) {
    if (id[k] == k) return k;
    return id[k] = find(id[k]);
}
bool cmp(struct Edge a, struct Edge b) {
    return a.t < b.t ;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> n >> m ;
    for (int i = 1; i <= n; i++)
        id[i] = i;
    int z, x, y;
    for (int i = 0; i < m; i++)
        cin >> edge[i].x >> edge[i].y >> edge[i].t ;

    sort(edge, edge + m, cmp);

    for (int i = 0; i < m; i++) {
        if (find(edge[i].x ) != find(edge[i].y )) {
            id[find(edge[i].x)] = find(edge[i].y);
            n--;
        }
        if (n == 1) {
            cout << edge[i].t << endl;
            break;
        }
    }
    if (n != 1) cout << "-1\n" ;
    return 0;
}

P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

考虑\(dp[i]\)表示为过去一个子段当前点的最大值,所以得出转移方程\(dp[i] = max(dp[i -1]+a[i],a[i])\),如果过去的加上现在的还更小了,那我们直接就断掉前面的,又从当前点新开一个段

#include<bits/stdc++.h>

using i64 = long long;

using namespace std;

typedef pair<i64, i64> PII;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<i64> a(n + 1);
    for(int i = 1;i <= n;i ++) 
        cin >> a[i];

    a[0] = INT_MIN;
    vector<i64> dp(n + 1,INT_MIN);
    for(int i = 1;i <= n;i ++){
        dp[i] = max(dp[i - 1] + a[i], a[i]);
    }

    i64 ans = *max_element(dp.begin() + 1, dp.end());
    cout << ans << '\n';

    return 0;
}

标签:洛谷,int,cin,find,edge,using,15,100,id
From: https://www.cnblogs.com/Kescholar/p/17654936.html

相关文章

  • 微服务引擎 MSE 全新升级,15 分钟快速体验微服务全栈能力
    作者:草谷前言微服务引擎MSE全新发布!新版本带来了一系列令人振奋的特性和改进,让您更轻松、高效地构建和管理微服务应用程序。从快速入门到迁移优化,MSE为开发人员提供了全方位的支持和解决方案。无论您是刚刚接触微服务还是已经深耕其中,MSE都将为您带来独特的体验和突破。让我......
  • C语言经典100题之循环嵌套
    1,有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?思路分析:首先来分析这道题目,三位数,无非就是i,j,k的三种不同组合,互不相同翻译成C语言就是i!=j,i!=k,j!=k。无重复我们可以使用枚举法枚举所有的三位数,然后判断是否满足互不相同的条件即可,利用三重循环......
  • elasticsearch from + size must be less than or equal to: [10000] but was [100000
    说明:当分页查询时,默认最大总数是10000(from+size<=10000),当我现在业务需要查询最大100000条时,就报错了。方案1:可以为某个es放开到指定的返回总数,也可以对整个es的索引做设置。但这样对内存消耗很大,可能导致内存溢出,elasticsearch重启又会恢复默认10000基于特定索引生效配置......
  • P1507 NASA的食物计划
    有n种候选食物,且只有一样,分别给出对应食物的体积、质量、卡路里飞船空间和载重都有限,分别为v和m,求能承载食物的最大卡路里1.动态规划voidmaxval(intv,intm,vector<int>&weight,vector<int>&volume,vector<int>&w){intn=w.size();intdp[v+1][m+1];memse......
  • 20天 hot 100 速通计划-day15
    栈394.字符串解码给定一个经过编码的字符串,返回它解码后的字符串。编码规则为:k[encoded_string],表示其中方括号内部的encoded_string正好重复k次。注意k保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。......
  • 15、oracle误删数据恢复
    目录oracle误删数据恢复1、delete删除数据2、drop删除表恢复oracle误删数据恢复1、delete删除数据回滚到指定时间点的数据select*fromgscommtypeasoftimestampto_timestamp('2019-08-2823','yyyy-mm-ddhh24');2、drop删除表恢复selectobject_name,origi......
  • 1004:字符三角形
    1004:字符三角形时间限制:1000ms      内存限制:66536KB提交数:206516   通过数:114143【题目描述】给定一个字符,用它构造一个底边长5个字符,高3个字符的等腰字符三角形。【输入】输入只有一行,包含一个字符。【输出】该字符构成的等腰三角形,底边长......
  • 1005:地球人口承载力估计
    1005:地球人口承载力估计时间限制:1000ms      内存限制:65536KB提交数:143681   通过数:82259【题目描述】假设地球上的新生资源按恒定速度增长。照此测算,地球上现有资源加上新生资源可供x亿人生活a年,或供y亿人生活b年。为了能够实现可持续发展,避免资源......
  • 1003:对齐输出
    1003:对齐输出时间限制:1000ms      内存限制:66536KB提交数:297394   通过数:98910【题目描述】读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们,按照格式要求依次输出三个整数,之间以一个空格分开。【输入】只有一行,包含三个整数,整数之间以一个......
  • 1002:输出第二个整数
    1002:输出第二个整数时间限制:1000ms      内存限制:65536KB提交数:181991   通过数:140246【题目描述】输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数。把第二个输入的整数输出。【输入】只有一行,共三个整数,整数之间由一个空格分隔。整数......