CSUST 8.4 早训

Posted dwvictor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSUST 8.4 早训相关的知识,希望对你有一定的参考价值。

## Problem A

 A - Memory and Crow

 CodeForces - 712A

题意:

分析可得bi=ai+ai+1

题解:

分析可得bi=ai+ai+1

C++版本一

 

技术图片
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 7;
int a[maxn];

int main(int argc, char const *argv[])

    int n;
    cin >> n ;
    for(int i = 1;i <= n;i ++) cin >> a[i];
        for(int i = 1;i < n ;i ++) cout << a[i] + a[i + 1] << " ";
            cout << a[n] << endl;
    return 0;
View Code

 

## Problem B

 B - Memory and Trident

 CodeForces - 712B 

题意:

  一个人站在坐标原点处,他可以往上(U), 下(D), 左(L), 右(R), 四个方向移动,现给你一个移动序列,为了使他最后仍然能回到原点,你需要对这个序列做一些改变,每次可以改变其中一个字母,问最少的改变次数.

题解:

如果这个序列的长度是奇数,那么肯定不可能回到原点,则直接输出“-1”, 否则可以这么想, 如果 “U” 与 “ D” 和 “L” 与 “R” 能成对出现(和出现次序无关), 那么肯定可以回到原点,所以这里需要做的就是分别统计这四个操作出现的次数, 水平方向相减, 竖直方向相减, 意味着去掉成对出现的对数. 如果结果不为 0 ,那么就需要做出改变,可以想到, 对相减后的差值除 2 就可以得到最少的改变次数.

C++版本一

技术图片
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 7;
int a[maxn];

int main(int argc, char const *argv[])

    string str;
    cin >> str;
    int l , r , u , d;
    l = r = u = d = 0;

    for(int i = 0;i < str.size();i ++)
        if(str[i] ==L) l ++;
        if(str[i] ==R) r ++;
        if(str[i] ==U) u ++;
        if(str[i] ==D) d ++;

    
    int ans = abs(l - r) + abs(u - d);
    if(str.size() % 2 == 0) cout << ans / 2<< endl;
        //if(str[i] ==‘L‘) l ++;
    else cout << -1 << endl;
    return 0;
View Code

 


## Problem C

 C - Memory and De-Evolution

 CodeForces - 712C

题意:

题目大意:给你一个长度为x的等边三角形,每一秒你能修改一条边的长度,要你修改到长度为y的等边三角形,要求修改过程中保证它是一个三角形。

题解:

解题思路:从y开始倒着往x推。

C++版本一

 

技术图片
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 7;
int a[maxn];
priority_queue<int>q;
int main(int argc, char const *argv[])

    int n , m ;
    cin >> n >> m ;
    // q.push(m);
    // q.push(m);
    // q.push(m);
    // //q.push(1);

    // while(q.top() != n )
    //     int t = q.top();
    //     q.pop();
    //     if(t)
    // 
    std::vector<int > v;
    v.push_back(m);
    v.push_back(m);
    v.push_back(m);
    int i = 0;
    int ans = 0;
    while(v[0] <  n)
        ans ++;
        //for(int i = 0;i < 3;i ++)
            v[0] = v[1] + v[2] - 1;
            
            //if(v[i] >= n) v[i] = n;
        //
        sort(v.begin(), v.end());
        // for(int i = 0;i < 3 ;i ++)
        //     cout << v[i] << endl;
        // 
        // cout << "-----------" << endl;
    
    cout << ans << endl;
    return 0;
View Code

 

## Problem D

 D - Memory and Scores

 CodeForces - 712D 

题意:

 

题解:

 

C++版本一

 

## Problem E

 E - Sonya and Queries

 CodeForces - 713A

题意:

一个multiset,有t个操作,其中+ a表示multiset中加入一个数a,-a表示从multiset取出a,?表示每次询问一个01串s,如果s的一位是0,那么所匹配的数的该位应该是偶数,反之如果是1所匹配的改位应该是奇数。如果匹配时产生数位不够的问题的话添加前导0。每次询问有多少个数和s串能够匹配。

题解:

不是题目中有multiset,就一定要用multiset,这题其实就是题目难读,仔细思考一下用map操作一下就好了


+a时将 a变成一个对应询问的01串即可。举例说明:

361==101

241==001==1

然后对应保存这个得到的01串(要用long long )为tmp,然后map[tmp]++;

同理-a 对应着map[tmp]--;

那么在询问的时候,直接输出当前01串映射的值即可。

C++版本一

 

技术图片
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 7;
int a[maxn];
 std::map<long long  , int> mp;
char s[2];
long long x;
string str;
long long solve(string x)
    long long tmp = 0;
    for(int i = 0;i < x.size(); i ++)
        tmp = tmp * 10 + ((x[i] - 0) % 2) ;
    
    return tmp;



int main(int argc, char const *argv[])

    int n;
    cin >> n ;
    for(int i = 1;i <= n ; i ++)
        cin >> s ;
        if(s[0] == +)
        cin >> str;
            long long a = solve(str);
            // string a;
            // for(int i = 0;i < str.size();  i++)
            //     if((str[i] - ‘0‘) % 2 == 0) a.push_back(‘0‘);
            //     else a.push_back(‘1‘);
            // 
            //cout << a << endl;
            mp[a] ++;
        
        if(s[0] == -)
            cin >> str;
            //     string a;
            // for(int i = 0;i < str.size();  i++)
            //     if(str[i] - ‘0‘ % 2 == 0) a.push_back(‘0‘);
            //     else a.push_back(‘1‘);
            // 
            long long a = solve(str);
            mp[a] --;
        
        if(s[0] == ?)
            cin >> x;
        cout << mp[x] << endl;

        
    

    return 0;
View Code

 

## Problem F

 F - Sonya and Problem Wihtout a Legend

 CodeForces - 713C 

题意:

https://blog.csdn.net/lycheng1215/article/details/80089004

题解:

https://blog.csdn.net/lycheng1215/article/details/80089004

C++版本一

技术图片
#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 7;
int a[maxn];

priority_queue<int>s;



int main(int argc, char const *argv[])

    int n;
    cin >> n;
    long long ans = 0;
    for(int i = 1;i <= n ; i ++) 
        cin >> a[i];
        a[i] -= i;
        s.push(a[i]);
        if(s.top() > a[i])
            ans += s.top() - a[i];
            s.pop();
            s.push(a[i]);
        
    
    cout << ans << endl;
    return 0;
View Code

 

以上是关于CSUST 8.4 早训的主要内容,如果未能解决你的问题,请参考以下文章

CSUST 8.3 早训

CSUST 4002-你真的会字符串吗?(DP)

CSUST选拔赛题解

CSUST-4.26集训队选拔(全解)

CSUST--3.28排位周赛第六场 (全解)

2021-5-11 CSUST 周练 Codeforces Gym #102894