codeforces周赛div3#855记录

目录

总结

一,A. Is It a Cat?

二,B. Count the Number of Pairs

三,C1. Powering the Hero (easy version)

四,C2. Powering the Hero (hard version)

栈和队列常用操作+区别


总结

codeforces周赛div3#855记录_第1张图片

真羡慕ACM校队的同学,能AC七八题,甚至ak

可能别人从div4一道题都做不对,到div3,AC 九题,只需要几个月的时间

那么从div3AK到div2AK他们又需要多久呢?也许是半年?

div2AK的实力,拿铜牌是否有希望呢,观望大佬成长

对于字符串,vector, queue的常用函数的使用还很生疏,所幸经过这次锻炼,下次应该可以AC同类型的题

因为不熟练,浪费了接近一半的时间在百度搜vector和queue的用法,以及字符串常用函数

知识点

1,字符串常用函数

头文件#include

1,截取子串

s.substr(i)从下标i开始截取到结尾,s.substr(i, j)从下标i开始截取j个字符

2,替换子串

s.replace(i, j, s1)用s1替换s中从下标i开始的j个字符

3,查找子串

s.find(s1) 查找s1在s中第一次出现的下标

s.rfind(s1) 查找s1在s中最后一次出现的下标

4,删除子串

s.erase(i, j)删除从下标i开始的j个字符

关于s.find()补充

#include
#include
using namespace std;

int main()
{
    string s1 = "babajiaoni";
    string s2 = "bajiao";
    string s3 = "babb";

    if(s1.find(s3) == string::npos) //找不到子串
        cout<<"找不到子串"<
找不到子串
能找到子串

2,queue

→ (2条消息) C++优先队列priority_queue详解_priority_queue头文件_是一只派大鑫的博客-CSDN博客

→ 

(5条消息) C++队列queue用法详解(超详细)_轻松学C语言的博客-CSDN博客

3,vector

→ (5条消息) c++ vector详解_~不羁的博客-CSDN博客

反思

只过了2题,第三题一开始尝试vector + priority_queue,但是写了70多行,非常混乱,写写改改,最后还是没过

今早补题,才发现想复杂了,臆想多了一个限制条件,但是样例并没有体现我这个思路的错误

后来拿第三题(easy version)AC的代码提交第四题(hard),发现第四题也直接过了

一,A. Is It a Cat?

Problem - A - Codeforces

标签:模拟,字符串

codeforces周赛div3#855记录_第2张图片

codeforces周赛div3#855记录_第3张图片

codeforces周赛div3#855记录_第4张图片这个思路不是很清晰,写写改改才AC,代码非常臃肿

用了字符串函数中的s.find()和s.rfind(),头文件是#include

关键是,现在codeforces不知道为什么禁止中文注释了,说我不符合utf-8标准。。。。

这里又浪费了10分钟。。

AC  代码

#include
#include //s.find(s1)
using namespace std;
int main()
{
    int t, n;
    string s;
    cin>>t;
    while(t--) {
        int flag = 1;
        cin>>n;
        cin>>s;
        for(int i = 0; i < n; ++i)
            if(s[i] == 'M' || s[i] == 'E' ||
            s[i] == 'O' || s[i] == 'W')
                s[i] += 32;
        if(s.find('w') == string::npos || s.find('o') == string::npos
        || s.find('e') == string::npos || s.find('m') == string::npos) {
            cout<<"NO"<

二,B. Count the Number of Pairs

Problem - B - Codeforces

标签:贪心,字符串

codeforces周赛div3#855记录_第5张图片

 codeforces周赛div3#855记录_第6张图片

 codeforces周赛div3#855记录_第7张图片初始思路不是很清晰,写了50多行才AC

AC  代码

#include
#include
using namespace std;
int a[26], b[26];
int main()
{
    int t, n, k, ans;
    string s;
    cin>>t;
    while(t) {
        t--;
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        ans = 0;
        cin>>n>>k;
        cin>>s;
        for(int i = 0; i < n; ++i) {
            if(s[i] >= 'a' && s[i] <= 'z')
                a[s[i] - 'a']++;
            if(s[i] >= 'A' && s[i] <= 'Z')
                b[s[i] - 'A']++;
        }
        for(int i = 0; i < 26; ++i) {
            if(a[i] >= b[i]) {
                ans += b[i];
                a[i] -= b[i];
                b[i] = 0;
            }
            else {
                ans += a[i];
                b[i] -= a[i];
                a[i] = 0;
            }
        }
        for(int i = 0; i < 26; ++i) {
            if(a[i] >= 2)
                while(k > 0 && a[i] >= 2) {
                    ans += 1;
                    k--;
                    a[i] -= 2;
                }
            else if(b[i] >= 2)
                while(k > 0 && b[i] >= 2) {
                    ans += 1;
                    k--;
                    b[i] -= 2;
                }
            if(k == 0) break;
        }
        cout<

三,C1. Powering the Hero (easy version)

Problem - C1 - Codeforces

标签:数据结构,贪心 

codeforces周赛div3#855记录_第8张图片

 codeforces周赛div3#855记录_第9张图片

 codeforces周赛div3#855记录_第10张图片这题臆想多了一个限制条件,多做了很多无用功,最后还不符合题意

简单的queue使用,其他都不需要了

30行优先队列能搞定的,我一开始愣是结合vector写了70行 

AC  代码

#include
#include
#include //scanf()
using namespace std;
int main()
{
    int t, n;
    scanf("%d", &t);
    while(t) {
        t--;
        scanf("%d", &n);
        long long ans = 0, m;
        priority_queueq;
        for(int i  = 0; i < n; ++i) {
            scanf("%lld", &m);
            if(m != 0) {
                q.push(m);

            }
            if(m == 0)
                if(!q.empty()) {
                    ans += q.top();
                    q.pop();
                }
        }
        cout<

四,C2. Powering the Hero (hard version)

标签:数据结构,贪心

同第三题,只是数据量不同,第三题AC  代码提交,也能过

AC  代码

同第3

#include
#include
#include //scanf()
using namespace std;
int main()
{
    int t, n;
    scanf("%d", &t);
    while(t) {
        t--;
        scanf("%d", &n);
        long long ans = 0, m;
        priority_queueq;
        for(int i  = 0; i < n; ++i) {
            scanf("%lld", &m);
            if(m != 0) {
                q.push(m);

            }
            if(m == 0)
                if(!q.empty()) {
                    ans += q.top();
                    q.pop();
                }
        }
        cout<

栈和队列常用操作+区别

注意区分,元素的添加(st.push_back())和删除(st.pop_back())都是在尾部操作

队列元素的添加(q.push())在尾部操作, 删除(q.pop())在头部操作(队首出队)

队列和栈在st.empty()q.empty() 以及 st.size()q.size()的使用上一样 

关于vector和queue的区别:

1,vector常用操作

//添加元素到末尾
vectorst;
st.push_back(666);

//返回大小
st.size();

//判断为空
st.empty();

//删除末尾元素
st.pop_back();

//拷贝st的元素到st2
vectorst2(st);

//判断相等
if(st == st2)

2,queue常用操作

当然,适用于queue的也适用于priority_queue

//最大值优先队列
priority_queuea;
//最小值优先队列
priority_queue, greater>c;

//结合pair
priority_queue>aa;
pair bb(1, 2);
aa.push(bb);
cout<q;
//尾部插入元素
q.push(66);

//头部删除元素
q.pop();

//返回队列第一个元素
q.front();

//返回队列最后一个元素
q.back();

自钱孔入,而钱不湿 --> 惟手熟尔

现在还生疏,一道vector或者queue的简单题,可能需要半小时到一小时

等以后熟练了,现在一个小时的题,只需要5分钟,慢慢来

你可能感兴趣的:(c++)