最急救助(4765)

方法一:
#include <cstring>
#include <iostream>
using namespace std;
int maxn=0,t[110];
int main() 
{
    int n;
    cin>>n;
    string sos;
    string name[110];
    //开始统计 
    for (int i = 1; i <= n; i ++)
    {
        cin >> name[i] >> sos;
        int len = sos.length();
        for (int j = 0; j < len; j ++) 
        {
            if (sos[j] == 's' && sos[j + 1] == 'o' && sos[j + 2] == 's') 
                t[i] ++;
            maxn = maxn > t[i] ? maxn : t[i];//找sos出现次数最多的一次
        }
    }
    for (int i = 1; i <= n; i ++)
        if (t[i] == maxn)
            cout << name[i] <<" "; 
    cout<<endl<<maxn;
    return 0;
}
方法二:
#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
    string name,help;
    int s,num;
    //name 是求助者的名字
    //help 是求助者的求助信息
    //s 是求助信息中子串 sos 的数量
    //num 是求助者的顺序
}str[105];
int find(string qwq){                   //寻找子串 sos 的数量
    int len=qwq.size();                 //提取出这个字符串的长度STL 大法好QwQ
    int anss=0;                         //子串 sos 的数量
    for(int i=0;i<len-2;i++){           //从头到尾枚举
        if(qwq[i]=='s'&&qwq[i+1]=='o'&&qwq[i+2]=='s'){  //如果这里有一个 sos
            anss++;                     //子串 sos 的数量+1
        }
    }
    return anss;                        //返回子串 sos 的数量
}
bool cmp(node p,node q){                //比较函数 cmp
    if(p.s==q.s){                       //如果两个求助信息中的子串 sos 的数量都相同
        return p.num<q.num;             //按照输入顺序排序
    }
    return p.s>q.s;                     //否则按照求助信息中的子串 sos 的数量排序
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);                        //黑科技cin,cout加速
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>str[i].name>>str[i].help;
        str[i].s=find(str[i].help);     
        str[i].num=i;
    }
    sort(str+1,str+n+1,cmp);            //STL 大法好QWQ
    int tmp=str[1].s;                   //排序之后最前面的那个自然就是子串 sos 最多的啦QwQ直接记录即可。
    for(int i=1;i<=n;i++){
        if(str[i].s!=tmp){              //如果子串 sos 的数量少于 tmp
            break;                      //立刻退出循环停止输出
        }
        cout<<str[i].name<<" ";
    }
    cout<<endl<<tmp;                    //别忘了换行哦
    return 0;
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值