题解2023.5.21

news/2024/7/15 17:06:23 标签: c++, 算法, 图论

B. Diverse Substrings 
思路:直接枚举超时,数的种类为0-9,所以对于每个位置只需往后延伸100位即可,超过100位必重复
 

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(fast) 
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<math.h>
#include<map>
 #include<vector>
#define ms(x,y) memset(x,y,sizeof x)
#define fu(i,a,b) for(int i=a;i<=b;i ++ )
#define fd(i,a,b) for(int i=a;i>=b;i -- )
#define int long long 
const int maxn=2e5+10,INF = 0x3f3f3f3f ; 
using namespace std;
int a[maxn];
 int i,j,k;
 void solve() {
     int n; 
     string s;
     cin >> n >> s;
     int ans = 0;
     for (int i = 0; i < n; i++) {
         vector<int> cnt(10);
         int Max = 0, sum = 0;
         for (int j = i; j < min(n, i + 100); j++) {
             if (++cnt[s[j] - '0'] == 1)
                 sum++;
             Max = max(Max, cnt[s[j] - '0']);
             if (sum >= Max) ans++;
         }
     }
     cout << ans << endl;
 }
signed main()
{
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }

}

B - Tying Rope 
思路:vector二维数组存图,对于相连的全部度数为2则形成循环,否则不
 

#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<math.h>
#include<map>
#include<vector>
#define int long long 
const int maxn = 2e5 + 10;
using namespace std;
bool vis[maxn];
int d[maxn];
void solve() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>>a(n + 1, vector<int>());
    for (int i = 1; i <= m; i++) {
        int u, v;
        char c1, c2;
        cin >> u >> c1 >> v >> c2;
        a[u].push_back(v);
        a[v].push_back(u);
        d[u]++, d[v]++;
    }
    memset(vis, 0, sizeof vis);
    int x = 0, y = 0;
    for (int i = 1; i <= n; i++) {
        if (!vis[i]) {
            queue<int> q;
            q.push(i);
            bool flag = 0;
            vis[i] = true;
            while (!q.empty()) {
                int qu = q.front();
                q.pop();
                if (d[qu] != 2)
                    flag = 1;
                for (auto z : a[qu]) {
                    if (!vis[z]) {
                        q.push(z);
                        vis[z] = true;
                    }
                }
            }
            if (!flag)
                x++;
            else
                y++;
        }
    }
    cout << x << ' ' << y << '\n';
}
signed main()
{
    ios::sync_with_stdio(false);
    solve();
}

B. Restore the Weather
思路1:最优策略(与k无关)为:排序为a,b均从小到大排序,根据a位置输出b位置,采用结构体排序

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(fast) 
#include<iostream>
 #include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<math.h>
#include<map>
#define int long long 
const int maxn=2e5+10; 
using namespace std;
int b[maxn];
struct node {
    int x;
    int y;
}a[maxn];
bool cmp(node A,node B) {
    return A.y < B.y;
}
bool cmp1(node A, node B) {
    return A.x < B.x;
}
 void solve(){
     int n, k;
     cin >> n >> k;
     for (int i = 1; i <= n; i++) {
         a[i].x = i;
         cin >> a[i].y;
     }
     for (int j = 1; j <= n; j++) {
         cin >> b[j];
     }
     sort(b + 1, b + 1 + n);
     sort(a + 1, a + 1 + n, cmp);
     for (int i = 1; i <= n; i++) {
         a[i].y = b[i];
     }
     sort(a + 1, a + 1 + n, cmp1);
     for (int i = 1; i <= n; i++) {
         cout << a[i].y << ' ';
     }
     cout << '\n';
 }
signed main()
{
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

G. Hits Different
采用dp,dp公式 dp[i][j]=k*k+dp[i-1][j]+dp[i-1][j-1]-(重复部分)dp[i-2][j-1]

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int maxn = 1e6 + 10;
int dp[3000][3000]; 
int a[maxn];
void solve() {
    int n;
    cin >> n;
    cout << a[n] << '\n';
    }
void init() {
    dp[1][1] = 1;
    a[1] = 1;
    int k = 2;
    for (int i = 2; i <= 3000; i++) {
        for (int j = 1; j <= i && k <= 1000000; j++, k++) {
            dp[i][j] = k * k + dp[i - 1][j] + dp[i - 1][j - 1] - dp[i - 2][j - 1];
            a[k] = dp[i][j];
        }
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    init();
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

C.Zero - Sum Prefixes
思路:无论前面怎么操作,前缀和在这个位置保持一致
 最优操作把出现0位置后前缀和值出现最多的次数变成0,统计相加,最后加上第一个0前面前缀和为0个数

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(fast) 
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<math.h>
#include<map>
#include<vector>
#define ms(x,y) memset(x,y,sizeof x)
#define int long long 
const int maxn = 2e5 + 10, INF = 0x3f3f3f3f;
using namespace std;
int a[maxn], b[maxn];
int i;
void solve() {
    int n;
    cin >> n;
    int ans = 0;
    vector<int>v;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        b[i] = a[i] + b[i - 1];
        if (a[i] == 0) {
            v.push_back(i);
        }
    }
    v.push_back(n + 1);
    map<int, int>cnt;
    for (int i = 1; i < v.size(); i++) {
        int Max = 0;
        cnt.clear();
        for (int j = v[i-1]; j < v[i]; j++) {
            cnt[b[j]]++;
            Max = max(Max, cnt[b[j]]);
        }
        ans += Max;
    }
    for (int i = 1; i < v[0]; i++) {
        if (b[i] == 0) {
            ans++;
        }
    }
    cout << ans << '\n';
}
signed main()
{
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}


lower_bound() 函数用于在指定区域内查找不小于目标值的第一个元素。
c++语言中,multiset是<set>库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,
而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数。(可搭配erase,lower_bount使用)
自定义排序bool cmp(类型 A,类型 B){};


http://www.niftyadmin.cn/n/346075.html

相关文章

法规标准-ISO 17361标准解读

ISO 17361是做什么的&#xff1f; ISO 17361全称为智能交通系统-车道偏离警告系统性能要求和测试程序&#xff0c;其中主要描述了LDWS系统的功能要求及测试要求 系统功能 车道偏离警告系统的功能元件应符合图中的要求&#xff0c;抑制请求、车速检测、驾驶员偏好和其他附加功…

VS Code 配置 C/C++ 开发环境

一、软件下载 需要下载的软件如下&#xff1a; VS Code编译工具&#xff1a;MinGW 或 MSYS2 或 VS2022 VS Code 下载地址&#xff1a;链接 MinGW 下载地址&#xff1a;链接 或者 链接 MSYS2 下载地址&#xff1a;链接 VS2022 下载地址&#xff1a;链接 上述软件下载完成以后…

java入门-W11(K168-K182)网络编程

1. 网络编程入门 1.1 网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统…

chatgpt赋能Python-python5__2

Python中整除运算符 // 的用法和重要性 在Python中&#xff0c;整除运算符 // 有着广泛的应用&#xff0c;特别是在数据分析、科学计算、金融量化、游戏开发等领域中&#xff0c;它是很重要的基础运算符。 什么是整除运算符 //&#xff1f; 整除运算符 // 是Python中的一种二…

基于单片机的数据采集系统

摘 要&#xff1a;本文以AT89C51单片机为核心&#xff0c;设计一个基于单片机的数据采集系统。系统可以采集16路模拟量&#xff0c;精度为12位&#xff0c;16路开关量和2路脉冲量&#xff0c;并将采集到的数据每隔一分钟通过串口发送到PC机。 关键字&#xff1a;AT89C51&#…

LeetCode104. 二叉树的最大深度(递归非递归)

写在前面&#xff1a; 题目链接&#xff1a;LeetCode104.二叉树的最大深度 编程语言&#xff1a;C 题目难度&#xff1a;简单 一、题目描述 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子…

章节1:信息收集

章节1:信息收集 1 信息收集概览 01 为什么要做信息收集&#xff1f; 渗透测试的流程 确定目标 信息收集 漏洞扫描 漏洞利用 形成报告 信息收集包括的内容 域名信息、IP段、开放的端口、网站架构、文件目录结构、软件版本、WAF、旁站、C段… 分类 域名相关信息IP相关…

[CTF/网络安全] 攻防世界 simple_js 解题详析

[CTF/网络安全] 攻防世界 simple_js 解题详析 代码分析代码漏洞姿势String[fromCharCode]总结 题目描述&#xff1a;小宁发现了一个网页&#xff0c;但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} ) 页面源代码&#xff1a; 代码分析 function dechiffre(pass_enc){…