题目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 ; }