每日练习题(12-05)

目录

1.幸运的3

2.连续的串 

3.找1 


1.幸运的3

题目描述

你有n个数,可以将题目两两匹配(即两个数首尾相连),每个数只能使用一次,问匹配后最多有多少个3的倍数?

输入格式

第一行一个n,接下来n个正整数。 

输出格式

输出最多有多少3的倍数。 

样例输入

123 123 99 

样例输出

思路:如果两个数都能够整除3,拼出来的数字那么一定 可以整除3,一个余数为2和余数为1的数也可以拼出能够整除3的数。

#include
using namespace std;
int a[4];
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        a[x%3]++;
    }
    cout<

2.连续的串 

题目描述

给你一个字符串,找出次数最多的长度为2的子串。

输入格式:

第一行为一个正整数n,表示给出字符串的长度,第二行为字符串。 

输出格式:

输出所求的字符串,若有多个结果,输出字典序最小的。 

样例输入: 

7

ABACABA

样例输出:

AB 

数据范围

2<=n<=100 

思路:简单哈希。 

#include
#include
#include
#include
using namespace std;
const int N=110;
char x[N];
map h;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>x[i];
    for(int i=1;i<=n-1;i++)
    {
        string y="";
        y+=x[i];
        y+=x[i+1];
        h[y]++;
    }
    int ans=0;
    string res;
    for(map::iterator it=h.begin();it!=h.end();it++)
    {
        if(it->second>ans)
        {
            ans=it->second;
            res=it->first;
        }
        else if(it->second==ans)
              res=min(res,it->first);
    }
    cout<

3.找1 

题目描述

最近小码哥爱上了二进制,他特别喜欢全是1的二进制,但通常会有0.

于是他给你一个二进制字符串,问你字符都为1的字串的个数(结果对109+7取模)

输入格式:

一个二进制字符串 

输出格式:

所有字符串都为1子串的个数。 

样例输入1:

0110111

样例输出1:

9

样例输入2:

101

样例输出2:

2

样例输入3:

111111

样例输出3: 

21

数据范围

1<=s.length<=1e5 

思路:我们用双指针算法,我们用sum记录总数,每次最多连续1的长度ans,则每次的方案数为 1+2+...+ans,我们这时候可以有两种方法:

方法一:直接暴力

for(int j=1;j<=ans;j++) ans+=j;

sum+=ans;

方法二:公式优化

1+2+..+n=n*(n+1)/2.

sum+=ans*(ans+1)/2;

#include
#include
#include
using namespace std;
int main()
{
    string s;
    cin>>s;
    int sum=0;
    for(int i=s.size()-1;i>=0;i--)
    {
        int ans=0;
        int j=i;
        while(s[j]=='1'&&j>=0)
        {
            ans++;
            j--;
        }
        sum+=ans*(ans+1)/2;
        i=j;
    }
    cout<

你可能感兴趣的:(比赛,算法,c++,蓝桥杯)