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[];
for(int i=;i<;i++)
cin>>A[i];
cin>>s; int count=,length=,l;
for(int i=;i<s.length();i++)
{
l=A[s[i]-'a'];
if(length+l>)
{
length=l;
count++;
}
else
{
length+=l;
}
}
cout<<count<<" "<<length<<endl; return ;
}

题目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 = ;
for(int i=;i<str.length();i++){
string temp = "" ;
if(str[i]==' ') continue ;
temp+=str[i] ;
while(i+<str.length()&&str[i+]!=' '){
i++ ;
temp+=str[i] ;
}
int num = stoi(temp) ;
if(m[num]){
m[num]-- ;
}else{
m[num] = num ;
cnt+=(num+) ;
}
}
cout << cnt << endl ;
}
上一篇:Cassandra最小化安装


下一篇:【转】XenServer体系架构解析