c++刷题(39/100)笔试题3

题目1:

现在你需要用一台奇怪的打字机书写一封书信。信的每行只能容纳宽度为100的字符,也就是说如果写下某个字符会导致行宽超过100,那么就要另起一行书写
信的内容由a-z的26个小写字母构成,而每个字母的宽度均会事先约定。例如字符宽度约定为[1,2,3,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],那么就代表'a'到'd'四个字母的宽度分别是1,2,3,4,而'e'到'z'的宽度均为5
那么按照上述规则将给定内容S书写成一封信后,这封信共有几行?最后一行宽度是多少?
思路:比较简单,开一个26的数组记录hash,然后会错的地方就是如果sum>100的时候才算新的一行
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    int A[26];
    for(int i=0;i<26;i++)
        cin>>A[i];
    cin>>s;

    int count=1,length=0,l;
    for(int i=0;i<s.length();i++)
    {
        l=A[s[i]-'a'];
        if(length+l>100)
        {
            length=l;
            count++;
        }
        else
        {
            length+=l;
        }    
    }
    cout<<count<<" "<<length<<endl;

    return 0;
}

题目2:

小明是幼儿园的一名老师。某天幼儿园园长给小朋友们每人发一颗糖果,小朋友们拿到后发现有一些同学拿到的糖果颜色和自己相同,有一些同学糖果颜色和自己不同。
假定每个小朋友只知道有多少同学和自己拿到了相同颜色的糖果。
上课后,有一部分小朋友兴奋的把这一结果告诉小明老师,并让小明老师猜一猜,最少有多少同学拿到了糖果。
例如有三个小朋友告诉小明老师这一结果如下:
其中第一个小朋友发现有1人和自己糖果颜色一样,第二个小朋友也发现有1人和自己糖果颜色一样,第三个小朋友发现有3人和自己糖果颜色一样。
第一二个小朋友可互相认为对方和自己颜色相同,比如红色;
第三个小朋友不可能再为红色(否则第一二个小朋友会发现有2人和自己糖果颜色相同),假设他拿到的为蓝色糖果,那么至少还有另外3位同学拿到蓝色的糖果,最终至少有6位小朋友拿到了糖果。
现在请你帮助小明老师解答下这个谜题。
思路:这道题方法就是当第一个人说有n个人和自己糖果颜色相同时,那么hash表中就记录m[n] = n,总人数+n+1(算上自己),此时再有人说有n个人和自己糖果颜色相同时就从hash表里减,总人数不增加,到0时又重新加总人数
这道题的坑点在于输入要自己处理,是带空格的一行字符串,然后要把数字抽出来
#include<iostream>
#include<string>
#include<map>
using namespace std ;
int main(){
    string str ;
    getline(cin,str) ;
    map<int,int> m ;
    int cnt = 0 ;
    for(int i=0;i<str.length();i++){
        string temp = "" ;
        if(str[i]==' ') continue ;
        temp+=str[i] ;
        while(i+1<str.length()&&str[i+1]!=' '){
            i++ ;
            temp+=str[i] ;
        }
        int num = stoi(temp) ;
        if(m[num]){
            m[num]-- ;
        }else{
            m[num] = num ;
            cnt+=(num+1) ;
        }
    }
    cout << cnt << endl ;
}

 

posted @ 2018-08-03 15:27  mask_天俊  阅读(511)  评论(0编辑  收藏  举报