• Codeforces Round #297 (Div. 2) 题解


    A题:

    有n个房间排成一条线,每个房间之间都有一个通道通往下个房间,则共有n-1个通道,现在你要从1到n,而且每个房间还放有一个钥匙,如果要开这个通道,通道的钥匙你有,则通过,否则你要买相应的钥匙。

    大写代表这个通道,小写代表相应的钥匙。

    问你最少需要买多少把钥匙。

    样例:

    input
    3
    aAbB
    output
    0
    input
    4
    aBaCaB
    output
    3
    input
    5
    xYyXzZaZ
    output
    2

    看样例应该就知道他要问什么了吧。

    思路:直接扫一遍过去,看缺多少则买多少。

     1 #include<cstdio>
     2 #include<cstring>
     3 const int maxn=100000+10;
     4 char s[maxn*2];
     5 int key[30];
     6 int main()
     7 {
     8     int n;
     9     while(scanf("%d",&n)!=EOF){
    10         n--;
    11         scanf("%s",&s);
    12         memset(key,0,sizeof(key));
    13         int ans=0;
    14         for(int i=1;i<n*2;i++){
    15             key[s[i-1]-'a']++;
    16             i++;
    17             s[i-1]=s[i-1]+32;
    18             if(key[s[i-1]-'a']>0)
    19                 key[s[i-1]-'a']--;
    20             else
    21                 ans++;
    22         }
    23         printf("%d
    ",ans);
    24     }
    25     return 0;
    26 }
    View Code

    B题:

    给出一个字符串,长度为s,然后给出m个操作,每一个操作,给出一个数a,然后对字符串(1到s)的第a个到第s-a+1这一段子序列进行反转,问这m个操作后,最后字符串是什么。数据保证a*2<=s。

    样例:

    abcdef
    1
    2
    output
    aedcbf
    input
    vwxyz
    2
    2 2
    output
    vwxyz
    input
    abcdef
    3
    1 2 3
    output
    fbdcea


    对每一个操作都进行,一定超时。

    对第i个位置,翻转偶次数,等于没有翻转。
    a[i]表示从第i个位置开始的字符串翻转的次数。
    然后初始化后开始记录,
    然后扫一遍a[i],确定字符串的第i个位置是否需要翻转。
    最后输出字符串。
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int maxn=200000+10;
     6 char s[maxn];
     7 int a[maxn];
     8 int main()
     9 {
    10     while(scanf("%s",&s)!=EOF){
    11         int len=strlen(s);
    12         memset(a,0,sizeof(a));
    13         int m;
    14         scanf("%d",&m);
    15         int u;
    16         for(int i=1;i<=m;i++){
    17             scanf("%d",&u);
    18             a[u]++;
    19             a[len-u+1]++;
    20         }
    21         for(int i=1;i<=len/2;i++){
    22             a[i]=a[i]%2;
    23             if(a[i])
    24                 a[i+1]++;
    25         }
    26         for(int i=len/2+1;i<=len;i++)
    27             a[i]=a[len-i+1];
    28         for(int i=1;i<=len;i++){
    29             if(a[i])
    30                 printf("%c",s[len-i]);
    31             else
    32                 printf("%c",s[i-1]);
    33         }
    34         printf("
    ");
    35     }
    36     return 0;
    37 }
    View Code
    比赛时只做了2道题,C,D,E会再补上来。
  • 相关阅读:
    远程视频监控之应用篇(mjpg-streamer)
    C语言存储类型
    基于Qt的wifi智能小车的制作(一)
    libevent和基于libevent的网络编程
    fdisk 分区格式化为ext4格式分区
    Makefile 中:= ?= += =的区别
    【计算机网络】详解网络层(二)ARP和RARP
    Nginx 反向代理 负载均衡 虚拟主机配置
    C# 对文本文件的几种读写方法总结
    Visual Studio中Image Watch的使用
  • 原文地址:https://www.cnblogs.com/-maybe/p/4372917.html
Copyright © 2020-2023  润新知