2019 训练计划——DFS+BFS+string专题( 每天10题 ) 训练计划③

A

Codeforces Round #173 (Div. 2), problem: (A) Bit++


题目大意

模拟 我们平常写代码的++x 和- -x 或者x++ x- -


题解

容易发现,每个字符串的区别就在于第2位,要么 + ,要么 - 只需要判断一下就好了

#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(cin>>n){
        int ans=0;
        string s;
        for(int i=0;i<n;i++){
            cin>>s;
            if(s[1]=='+')
                ++ans;
            if(s[1]=='-')
                --ans;
        }
        cout<<ans<<endl;
    }
    return 0;
}

B

Codeforces Beta Round #65 (Div. 2), problem: (A) Way Too Long Words

题目大意

字符串长度超过10个的,中间部分用中间部分长度代替


题解

对于输入的字符串,进行判断,长度大于10,那么就处理一下,中间长度等于总长度-2 最后将数字转化为字符串 (用stringstream就可以了)

#include<bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    string s;
    string res;
    for(int i=0;i<n;i++){
        cin>>s;
        res="";
        int len=s.length();
        if(len>10){
            len-=2;
            res+=s[0];
            stringstream ss;
            ss<<len;
            string s2;
            ss>>s2;
            res+=s2;
            res+=s[len+1];
            cout<<res<<endl;
        }
        else
            cout<<s<<endl;
    }
    return 0;
}

C

VK Cup 2012 Qualification Round 1, problem: (A) Next Round


题目大意

在一个数组中找到比给定值大的个数 不包括0


题解

水题,一层for循环解决

#include<bits/stdc++.h>
using namespace std;
const int maxn=100+5;
int a[maxn];
int n,m;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(cin>>n>>m){
        for(int i=1;i<=n;i++)
            cin>>a[i];
        int res=0;
        for(int i=1;i<=n;i++){
            if(a[i]>=a[m]&&a[i])
                ++res;
        }
        cout<<res<<endl;
    }
    return 0;
}

D

Codeforces Beta Round #89 (Div. 2), problem: (A) String Task


题目大意

将所有字母变为小写字母后,然后删除掉相应特殊字符,最后输出时在每个字母前加.


题解

题目意思很容易看懂,但有一个新知识:transform(s.begin(),s.end(),s.begin(),::tolower); 函数是用来将所有字母变为小写字母 把tolower变为toupper就是变成大写字母了

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin>>s;
    transform(s.begin(),s.end(),s.begin(),::tolower);
    int n=s.length();
    for(int i=0;i<n;i++){
        if(s[i]=='a'||s[i]=='o'||s[i]=='y'||s[i]=='e'||s[i]=='u'||s[i]=='i')
            continue;
        else
            cout<<'.'<<s[i];
    }
    cout<<endl;
    return 0;
}

E

Codeforces Beta Round #85 (Div. 2 Only) A. Petya and Strings


题目大意

比较两段字符串,大小写没限制,小于输出-1 等于输出0 大于输出1


题解

正好又用到了上题的函数,由于C++里面字符串可以按照字典序进行排序,然后题目要求大小写没限制,我们可以把它们全部变为小写字母或者大写字母都可以 然后我们直接进行比较就可以得出答案

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s1,s2;
    cin>>s1>>s2;
    transform(s1.begin(),s1.end(),s1.begin(),::tolower);
    transform(s2.begin(),s2.end(),s2.begin(),::tolower);
    if(s1<s2)
        cout<<-1<<endl;
    else if(s1==s2)
        cout<<0<<endl;
    else
        cout<<1<<endl;
    return 0;
}

F

Codeforces Beta Round #77 (Div. 2 Only) A. Football

题目大意

给你两支队伍,然后用一段字符串表示队伍的位置,两支队伍分别用0和1来表示 让你判断是否出现连续0或1 达到长度超过7 如果超过了就输出YES 否则输出NO


题解

直接遍历一遍字符串 用两个变量存0和1出现次数 只要一个出现次数超过了7次 直接输出YES 否则输出NO

#include<bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s;
    cin>>s;
    int flag=1;
    int n=s.length();
    int ans0=0,ans1=0;
    for(int i=0;i<n;i++){
        if(s[i]=='0'){
            ans1=0;
            ans0++;
        }
        if(ans0>=7){
            flag=0;
            break;
        }
        if(s[i]=='1'){
            ans0=0;
            ans1++;
        }
        if(ans1>=7){
            flag=0;
            break;
        }
    }
    if(!flag)
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;
    return 0;
}

G

Codeforces Beta Round #87 (Div. 1 Only) A. Party

题目大意

就是求小组个数,不存在雇佣关系,所需最小的组数其实就是树的最大深度,一棵树有多少层那就必须有多少个小组


题解

可以把他们的关系看成一棵树,去寻找树的最大深度,就可以用DSF来找,直接采用并查集方式找根节点

#include<bits/stdc++.h>
using namespace std;
const int maxn=2000+10;
int p,pre[maxn];
int cnt;
int dfs(int x){
    if(x==pre[x])
        return x;
    else{
        cnt++;
        return dfs(pre[x]);
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        pre[i]=i;
    for(int i=1;i<=n;i++){
        cin>>p;
        if(p!=-1)
            pre[i]=p;
    }
    int ans=-1;
    for(int i=1;i<=n;i++){
        cnt=1;
        dfs(i);
        ans=max(ans,cnt);
    }
    cout<<ans<<endl;
    return 0;
}

H

Codeforces Round #163 (Div. 2), problem: (A) Stones on the Table


题目大意

求需要几个步骤使得字符串中相邻的字符不相同


题解

水题,遍历一遍即可

#include<bits/stdc++.h>
using namespace std;
const int maxn=100+10;
char s[maxn];
int n;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>s[i];
    int ans=0;
    char ch;
    for(int i=0;i<n-1;i++){
        ch=s[i];
        if(s[i+1]==ch){
            ch=s[i+1];
            ++ans;
        }
    }
    cout<<ans<<endl;
    return 0;
}

I

题目链接


题目大意

将字符串第一个字符大写


题解

小写变为大写+32即可

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin>>s;
    if(s[0]>='a'&&s[0]<='z')
        s[0]-=32;
    cout<<s<<endl;
    return 0;
}

J

Codeforces Round #222 (Div. 1), problem: (A) Maze


题目大意

给出一个迷宫,’.’ 表示通路,‘#’ 表示城墙,输入的数据中,‘.’构成的已经联通,要求将k个’.‘转换成’#’,使得剩下的’.'仍然是联通的


题解

深搜,假设共有s个’.‘那么搜索得到的s-k个点必然是联通的,那么只要将剩下的’.‘转换成’#'就行了。

#include<bits/stdc++.h>
using namespace std;
int n,m,s;
const int maxn=500+10;
char mp[maxn][maxn];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
bool vis[maxn][maxn];
bool check(int x,int y){
    if(x>=1&&x<=n&&y>=1&&y<=m&&!vis[x][y]&&mp[x][y]=='.')
        return true;
    return false;
}
void dfs(int x,int y){
    vis[x][y]=1;
    for(int i=0;i<4;i++){
        int xx=x+dx[i];
        int yy=y+dy[i];
        if(check(xx,yy)){
            dfs(xx,yy);
        }
    }
    if(s){
        s--;
        mp[x][y]='X';
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m>>s;
    int px,py;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
        cin>>mp[i][j];
            if(mp[i][j]=='.'){
                px=i,py=j;
            }
        }
    }
    dfs(px,py);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<mp[i][j];
        }
        cout<<endl;
    }
    return 0;
}
学如逆水行舟,不进则退
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一百个Chocolate

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值