IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Codeforces Round#772 Div.2 -> 正文阅读

[数据结构与算法]Codeforces Round#772 Div.2

A. Min Or Sum 题目链接

题意:给你n个数,通过若干次操作,使得最后序列和最小。每次操作可以选取两个下标,i < j, 在满足ai | aj = x | y 的条件下,将ai替换为x, aj替换为y(其中,| 操作为或运算)。

思路:考虑或运算的性质,只有0和0进行或运算,结果才会是0。所以,但凡原数列的某一个位置含有数字1,那么进行异或操作之后的结果此位置结果必然为1。所以,在进行最后算数的时候,只需要将原数列的所有数进行或运算。

#include<bits/stdc++.h>
using namespace std;

int t, n;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> t;
    while(t -- ){
        cin >> n;
        int x = 0;
        while(n -- ){
            int y;
            cin >> y;
            x = x | y;
        }
        cout << x << endl;
    }
    return 0;
}

B. Avoid Local Maximums 题目链接

题意:给你一个序列,让你通过改变序列某些位置的值,使得序列不存在局部最大值(a[i] > a[i - 1] && a[i] > a[i + 1])。

思路:贪心。当我们找到一个i值,使得a[i] > [i - 1] && a[i] > a[i + 1]的时候,那么我们就接着去判断a[i + 1] 与 a[ i + 2]的关系,如果a[i + 1] < a[i + 2], 那么就从把a[i + 1] 变成 a[i], a[i + 2] 中更大的一个数,反之,就可以把a[i+ 1] 变成a[i]。

代码:

#include<bits/stdc++.h>
#define int long long int
using namespace std;

const int N = 2e5 + 10;
int t, n, a[N], b[N], c[N], d[N];

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> t;
    while(t -- ){
        cin >> n;
        int cnt = 0;
        for(int i = 1; i <= n; i++) cin >> a[i];
        for(int i = 2; i < n; i++){
            if(a[i] > a[i + 1] && a[i] > a[i - 1]){
                if(a[i + 1] < a[i + 2] && i + 2 < n){
                    a[i + 1] = max(a[i], a[i + 2]);
                }
                else a[i + 1] = a[i];
                cnt ++;
            }
        }
        cout << cnt << endl;
        for(int i = 1; i <= n;i ++){
            if(i == n) cout << a[i] << endl;
            else cout << a[i] <<" ";
        }
    }
    return 0;
}

C. Differential Sorting 题目链接

题意:给一个长度为n的序列,判断这个序列能否通过操作数小于等于n,使得序列变成一个非递减的序列。具体操作就是,选取下标x, y, z 满足x < y < z, 令 a[x] = a[y] - a[z]。

思路:关键的一点,是判断什么时候序列是不合法的。序列不合法的情况,无非就是a[n - 1] > a[n] 以及a[n] < 0两种情况。假设,a[k] <= a[k + 1], 一直到a[n], 那么说明a[k,n]中所有的数都是负数。如果a[k - 1] > a[k], 那么从后边选取k - 1 < x < y, 那么a[x] - a[y] 一定会破坏后边序列的不减性,因为减去一个负数等于加上一个整数。

代码:

#include<bits/stdc++.h>
#define int long long int
using namespace std;

const int N = 2e5 + 10;
int t, n, a[N], b[N], c[N], d[N];

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> t;
    while(t -- ){
        cin >> n;
        int cnt = 0;
        for(int i = 1; i <= n; i++) cin >> a[i];
        if(is_sorted(a + 1, a + 1 + n)){
            cout <<"0" << endl;
        }
        else if(a[n - 1] > a[n] || a[n] < 0){
            cout <<"-1" << endl;
        }
        else{
            cout << n - 2 << endl;
            for(int i = 1; i <= n - 2; i ++){
                if(i == n -2) cout <<i<<" "<< n - 1 <<" " <<n <<endl;
                else cout <<i<<" "<< n - 1 <<" " <<n << endl;
            }
        }
    }
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:51:10  更:2022-02-22 20:53:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:36:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码