A - 游游画U

题意:游游想让你画一个大小为 n 的 "U" ,你能帮帮她吗?
思路:找到' . ' 和 ' * '字符每行的规律发现他们中心对称

AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef long long LL;

const int N = 100010;

int n;

int main()
{
    cin >> n;
    for(int i = 1; i <= 4 * n - n; i ++)
    {
       for(int j = 1; j <= n; j ++)
       {
           cout << '*';
       }
       for(int k = n + 1; k <= 3 * n; k ++)
       {
           cout << '.';
       }
       for(int l = 3 * n + 1; l <= 4 * n; l ++)
       {
           cout << '*';
       }
       cout << endl;
    }
    
    for(int a = 1; a <= n; a ++)
    {
        for(int b = 1; b <= a; b ++)
        {
            cout << ".";
        }
        for(int c = a + 1; c <= a + n; c ++)
        {
            cout << '*';
        }
        for(int d = a + n + 1; d <= 4 * n / 2; d ++)
        {
            cout << '.';
        }
                for(int d = a + n + 1; d <= 4 * n / 2; d ++)
        {
            cout << '.';
        }
                for(int c = a + 1; c <= a + n; c ++)
        {
            cout << '*';
        }
                for(int b = 1; b <= a; b ++)
        {
            cout << ".";
        }
        cout << endl;
    }

    
    return 0;
}

B - 游游的数组染色

题意:
  游游拿到了一个数组,其中一些数被染成红色,一些数被染成蓝色。
  游游想知道,取两个不同颜色的数,且它们的数值相等,有多少种不同的取法?
  我们定义,两种取法如果取的某个数在原数组的位置不同,则定义为不同的取法。

思路:因为n的最大取值为2e5,所以使用常规的两层for循环会TLE,n * n会大于1e9;所以考虑使用STL里面的map函数能将时间复杂度降为O(n),然后建立map,键:数字 值 :[first,second] first 代表'R' second代表'B'

AC代码:

#include <iostream>
#include <algorithm>
#include <map>

using namespace std;

const int N = 200010;

typedef long long LL;

int n, temp;
int a[N];
LL ans = 0;
string colors;

int main() 
{

    cin >> n;
    
    for (int i = 0; i < n; i ++)
    {
        cin >> temp;
        a[i] = temp;
    }

    cin >> colors;
    
    map<int, pair<int, int>> mp;
    
    for (int i = 0; i < n;i ++)
    {
        if(colors[i] == 'R')
        {
            mp[a[i]].first ++;
        }
        else
        {
            mp[a[i]].second ++;
        }
    }

    for(auto& [k,v] : mp)
    {
        ans += v.first * v.second;
    }
    
    cout << ans;
    
    return 0;
}

C - 游游的交换字符

题意:
   游游拿到了一个01串(仅由字符'0'和字符'1'构成的字符串)。游游每次操作可以交换两个相邻的字符,例如,对于字符串"11001"而言,游游可以交换第二个字符和第三个字符变成"10101"。
游游希望最终字符串任意两个相邻的字符都不相同,她想知道最少需要多少操作次数?保证答案是有解的,即最终一定能形成任意两个相邻的字符都不相同的字符串。

思路:判断10的个数分别是oddever,如果abs(odd-ever) > 1,那么一定不满足。(这个性质很重要,我一开始没注意到0和1的个数只能相差1或者相等)但是题目中说的是前提满足。因此无需判断,那么对字符串长度分为两种情况

  1. 长度是偶数
  • 10101010....类型
  • 0101010....类型

2、长度是奇数

  • 101010101...类型
  • 0101010...类型

交换位置的时候,只需构造出上述可能的字符串,这里从第一位10以此遍历,然后让原来字符串对应位置和构造字符串的相对应位置的距离就是贡献。举个例子:

111000-->101010,这里我们移动1

  • 第一位1,下标为0,对应构造串的下标为0, 无需移动,贡献为 0
  • 第二位1,下标为1,对应构造串的下标为2, 贡献为 2-1=1
  • 第三位1,下标为2,对应构造串的下标为4, 贡献为 4-2=2

所以需要移动3次即可,我们移动0也是同理,两者是等价的。

AC代码:

#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

typedef long long LL;

int main()
{
    string s;
    cin >> s;
    
    LL n = s.size();
    LL sum = 0;
    
    for(int i = 0 ; i < n ; i ++ ) if(s[i] == '1') sum ++;
    
    if(n & 1)
    {
        vector<int> a(n);
        char c;
        if(sum == n / 2 + 1) c = '1';
        else c = '0';
        
        int k = 0;
        for(int i = 0 ; i < n ; i ++ )
            if(s[i] == c) a[k ++ ] = i;
        
        LL ans = 0;
        for(int i = 0 ; i < k ; i ++ )
            ans += abs(2 * i - a[i]);
        
        cout << ans << endl;
    }else 
    {
        LL ans = 0 , res = 0;
        vector<int> a(n);
        int k = 0;
        for(int i = 0 ; i < n ; i ++ ) if(s[i] == '1') a[k ++ ] = i;
        for(int i = 0 ; i < k ; i ++ )
            ans += abs(2 * i - a[i]);
        
        for(int i = 0 ; i < k ; i ++ )
            res += abs(2 * i + 1 - a[i]);
        
        cout << min(res , ans);
    }
    
    return 0;
}

零点工作室暑假集训(牛客周赛 Round 1)相关推荐

  1. 零点工作室暑假集训(牛客周赛 Round 3)

    A - 游游的7的倍数 题意: 思路:可以将该数先乘10后使其个数位为0:然后从0 ~ 6循环每次加1:因为7的倍数每7次就会有一次 AC代码 #include<bits/stdc++.h> ...

  2. 零点工作室暑假集训(牛客周赛 Round 2)

    A - 小红的环形字符串 题意: 小红拿到了一个环形字符串s.所谓环形字符串,指首尾相接的字符串. 小红想顺时针截取其中一段连续子串正好等于t,一共有多少种截法? 思路: 可以使用substr()函数 ...

  3. 零点工作室暑假集训(牛客练习赛113 )

    A - 小红的基环树 题意:定义基环树为n个节点.n条边的.没有自环和重边的无向连通图.定义一个图的直径是任意两点最短路的最大值.小红想道,n个节点构成的所有基环树中,最小的直径是多少? 思路:特判一 ...

  4. 零点工作室暑假集训(AtCoder--ABC288)

    A - Many A+B Problems 题意:计算n次A+B. 思路:模拟即可. 代码: #include <iostream> #include <algorithm> ...

  5. 零点工作室暑假集训(AtCoder--ABC308)

    A - New Scheme 题意:输出Yes的数要满足3种情况 1.升序的情况,也就是后面的数大于前面的 2.满足范围在100~675之间 3.满足可以整除25 思路:直接3个判断条件即可 AC代码 ...

  6. 零点工作室暑假集训(AtCoder--ABC266)

    A - Middle Letter 题意:总是输出中间的字符,字符数量为奇数 思路:计算出来字符串的长度,因为是长度为奇数的字符串,输出下标为( len + 1 ) / 2 的字符即可(这里字符串下标 ...

  7. 零点工作室暑假集训(AtCoder--ABC248)

    A - Lacked Number 题意:给定一个包含有长度为9的数字字符串S.字符串S中的所有数字都是从0到9中恰好出现一次,除了一个数字缺失.请打印出S中缺失的唯一数字. 思路: 一开始想到了记录 ...

  8. 零点工作室暑假集训(AtCoder--ABC259)

    A - Growth Record 题意:主人公N岁的时候身高为T,已知他[1,X]期间每年长D,后面不长个子,问M岁的时候他身高多少 思路:0岁的身高是T - X * D,然后在分情况讨论即可 AC ...

  9. 零点工作室暑假集训(AtCoder--ABC280)

    A - Pawn on a Grid 题意:就是让你求出这个n行n列中'#'的个数 思路:直接枚举就行了. AC代码: #include <iostream> using namespac ...

最新文章

  1. Java 垃圾回收机制,13张图给你讲清楚!
  2. 某班学生有50人会c语言的有40人,《离散数学》期末考试题目及评分标准
  3. 云原生生态周报 Vol. 15 | K8s 安全审计报告发布
  4. 设计模式之工厂模式(Factory)(3)
  5. python牛顿迭代公式_python计算牛顿迭代多项式实例分析
  6. json mysql php_PHP MySQL连接表作为JSON
  7. javaweb项目静态资源被拦截的解决方法
  8. Css绝对定位position
  9. linux桌面cpu,ubuntu14.04设置桌面显示网速、cpu信息等
  10. 制作VOC格式的数据集
  11. ASP.NET - 将 ASP.NET 用作高性能文件下载器
  12. arping的使用和原理简介
  13. win10 安装redis 解压版
  14. 搜索引擎的基本工作原理
  15. HPE 3PAR StoreServ存储系统连接解决方案
  16. 数据挖掘思维和实战20 Apriori 与 FP-Growth:不得不再说一遍啤酒与尿布的故事
  17. bootstrap 详细教程笔记
  18. 【存货系列】JS文字转语音方案设计及实现
  19. springMVC中前端同名name与后端接收
  20. 中国汽车氢传感器行业市场供需与战略研究报告

热门文章

  1. Neutron(二)上层资源模型篇
  2. Python安装Django
  3. svn版本管理工具使用教程
  4. 源码详解Android 9.0(P) 系统启动流程之SystemServer
  5. 被领导夸的时候,怎么回应?
  6. java GUI学习
  7. 需求分析与原型设计---升升备忘录
  8. 2018阿里云双12服务器年末钜惠低至2折
  9. Python读写文件你真的了解吗?
  10. 阿里云千岛湖数据中心启用:自然城市与人文科技的完美结合