2018大疆创新A卷

这里写图片描述
遍历一遍字符串,找到 j 就去统计前面的d的数量 和 后面 i的数量,然后乘起来,累加到sum中去(sum = 0)。找完所有的 j 前后d和i的数量的乘积后,最后sum就是得到的值
比如 ddabcjabci
只有一个j,前面两个d * 后面一个 i,==2,输出结果就是2

#include <iostream>
#include <vector>
using namespace std;


int main()
{
    int n;
    cin>>n;
    vector<string> ve;
    for(int i = 0; i < n; ++i)
    {
        string str;
        cin>>str;
        ve.push_back(str);
    }
    for(int i = 0; i < n; ++i)
    {
        int sum = 0,countd,counti;
        string temp = ve[i];
        for(int j = 0; j < temp.size(); ++j)
        {
            countd = 0;
            counti = 0;
            if(temp[j] == 'j')
            {
                for(int k = 0; k < j; ++k)
                {
                    if(temp[k] == 'd')
                        countd++;
                }
                for(int m = j+1; m <= temp.size(); ++m)
                {
                    if(temp[m] == 'i')
                                            counti++;
                }
                sum += countd*counti;
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}

这里写图片描述
两个数异或,然后统计异或后的数中1的个数,就是不同位的个数

#include <stdio.h>

static unsigned int count = 0;

void print(unsigned int n,unsigned int m)
{
    unsigned int k = n^m;
    while(k)
    {
        k = k&(k-1);
        count++;
    }
}

int main()
{
    unsigned int n;
    scanf("%ud",&n);
    unsigned int a[n];
    for(unsigned int i = 0; i < n; ++i)
    {
        scanf("%ud",&a[i]);
    }
    for(unsigned int i = 0; i < n; ++i)
    {
        for(unsigned int j = i+1; j < n; ++j)
        {
            print(a[i],a[j]);
        }
    }
    printf("%u\n",count);
    return 0;
}

这里写图片描述
这里写图片描述
比较繁琐,只能分条件进行遍历。

#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include<map>
#include<sstream>
#include<algorithm>
using namespace std;
int main()
{
        int N;
        cin>>N;
        vector<string> vec;
        map<string, vector<int> > hashtable;  //输出要按照时间大小,所以用map,拥有自动排序功能。
        if (getchar()  == '\n')
        {
            ;
        }
        for (int i = 0; i < N; i++)
        {
            string s;
            getline(cin, s);
            vec.push_back(s);
        }
        int mapMonthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //这个映射用来表示每个月有多少天
        for (int i = 0; i < vec.size(); i++)
        {
            string temp = vec[i];
            for (int j = 0; j < temp.size(); j++)
            {
                if (temp[j] == ' ')
                {
                    string key = temp.substr(0, j);
                    string value = temp.substr(j + 1);
                    string time = value;
                                        int hour = atoi((time.substr(0, time.find(':'))).c_str());
                    time = time.substr(time.find(':') + 1);
                    int min = atoi((time.substr(0, time.find(':'))).c_str());
                    int second = atoi(time.substr(time.find(':') + 1).c_str());
                    int seconds = hour * 60 * 60 + min * 60 + second;
                    if (hour >= 3)
                    {  //如果时间大于等于凌晨3点
                        hashtable[key].push_back(seconds - 3 * 60 * 60); //以凌晨3点为基准,重新计算,单位秒,作为时间轴。
                    } else
                    {  //时间小于凌晨3点
                        int months = atoi(key.substr(0, key.find('.')).c_str());
                        int days = atoi(key.substr(key.find('.') + 1).c_str());
                        if (days != 1)
                        {       //如果日期不是1号,要往前算一天
                            string month = to_string(months);
                            if (months < 10)
                            {  //考虑数字是否小于10,小于10,需要在字符串中加"0"
                                month = string("0") + month;
                            }
                            string day = to_string(days - 1);
                            if (days - 1 < 10)
                            {
                                day = string("0") + day;
                            }
                            key = month + string(".") + day;
                        }
                        else
                        { //如果是一号,月份同样往前算一个月(这里没有从1月份往前推,估计应该不太可能)
                            string month = to_string(months - 1);
                            if (months - 1 < 10)
                            {
                                month = string("0") + month;
                            }
                            string day = to_string(mapMonthDays[months - 2]);
                            if (mapMonthDays[months - 2] < 10)
                                                        {
                                day = string("0") + day;
                            }
                            key = month  + string(".") + day;
                        }
                        hashtable[key].push_back(seconds + 21 * 60 * 60);  //所有时间以凌晨3点为基准,重新计算
                    }
                    break;
                }
            }
        }
        map<string, vector<int> >::iterator iter = hashtable.begin();
        int idle_start = 12 * 60 * 60 + 30 * 60 - 3 * 60 * 60; //休息起始时间
        int idle_end = 14 * 60 * 60 - 3 * 60 * 60; //休息结束时间
        for (; iter != hashtable.end(); iter++)
        {
                if ((iter->second).size() >= 2)
                {
                    sort((iter->second).begin(), (iter->second).end()); //对时间进行排序
                    vector<int> temp = iter->second;
                    int result = 0;
                    if (temp[temp.size() - 1] < idle_start)
                    {  //考虑工作时间段与休息时间段的重叠,每次先固定最后打卡时间点,再分析最先打卡时间点
                        result = temp[temp.size() - 1] - temp[0];
                    }
                    else if (temp[temp.size() - 1] >= idle_start && temp[temp.size() - 1] < idle_end)
                    {
                        if (temp[0] < idle_start)
                        {
                            result = idle_start - temp[0];
                        }
                    }
                    else
                    {
                        if (temp[0] < idle_start)
                                                {
                            result = idle_start - temp[0] - (1 * 60 * 60  + 30 * 60);
                        }
                        else if(temp[0] >= idle_start && temp[0] < idle_end)
                        {
                            result = temp[temp.size() - 1] - idle_end;
                        }
                        else
                        {
                            result = temp[temp.size() - 1] - temp[0];
                        }
                    }
                    if (result > 0)
                    {
                        cout<<iter->first<<" "<<temp[temp.size() - 1] - temp[0]<<endl;
                    }
                }
        }
        return 0;
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值