华为3月9日笔试

第二题的输入是一个不定长数组,我想用c++ 的vector 来保存做,但是处理不了输入的结束标志, 以前遇到这种题一般都是先给一个n告诉你有多少个,第一次碰到这个不定长的不知道咋处理了。
vector<int> nums;

int a;
while(cin >> a) {
    nums.push_back(a);
}
像上面这样就会跳不出这个循环。

然后还像下面这种试了也不行。
do {
    cin >> a;
    nums.push_back(a);
} while(getchar() != EOF)

下面这种在我自己本机可以,但是在平台上不行。
do {
    cin >> a;
    nums.push_back(a);
} while(getchar() != '\n')

求教一下各位一般是怎么处理的
#华为春招笔试##华为##笔经#
全部评论
vector<int> nums; int a; while(cin >> a) {     nums.push_back(a); if(cin.get()=='\n') break; }</int>
3 回复 分享
发布于 2022-03-10 08:18
还有一种思路是输入字符串,然后以空格作为分割符到数组中
1 回复 分享
发布于 2022-03-10 08:19

相关推荐

专门在牛客上记录让自己破防的笔试题跪求路过大佬教教第三题做法##&nbsp;编程题###&nbsp;第一题输入n,然后输入一个长度为n的字符串s,接下来对于s的每一个前缀,将其依次反转然后拼接在一起,得到新的字符串s&#39;输入m,接下来m次查询,要求输出s&#39;的第m个字符(保证1&nbsp;&lt;=&nbsp;m&nbsp;&lt;=&nbsp;(n&nbsp;+&nbsp;1)&nbsp;*&nbsp;n&nbsp;/&nbsp;2)**数据范围**&nbsp;n,m在1e5&nbsp;对于所在的块写了一个二分,花了10min过的debug过程:第一次写的时候注意到了(n&nbsp;+&nbsp;1)*n溢出风险,所以用的long&nbsp;long,但是x一开始用int存的将x从int换为long&nbsp;long之后,20%-&gt;100%###&nbsp;第二题输入T,接下来T组数据每组数据:输入n,然后输入n个数,组成数组a。定义:对于一个长度至少为3的子序列,称其为V图,当x_1&gt;x2&gt;x3&gt;...&gt;xj且xj&lt;xj+1&lt;xj+2&lt;...&lt;xk 输出当前数组所有V图中,极差最大的那个的极差。**数据范围**&nbsp;T在1e3,&nbsp;n在1e5考虑每一个小标为j时对于答案的贡献,统计其左边和右边最大的数字,如果都大于a[j],则统计当前对答案的贡献左边右边最大的数字用dp,两边线性扫描。花了15分钟过的###&nbsp;第三题输入n以及正整数集合S&nbsp;=&nbsp;{s1,&nbsp;s2,&nbsp;...,&nbsp;sn}&nbsp;输入m,之后m次询问,每次一个x。判断S中有无这样的一个子集T,s.t.对于任意在[1,&nbsp;x]范围的正整数y,都存在T的一个子集T&#39;,使得T&#39;的元素之和等于y。如果存在,则输出所有满足上述条件的T中,元素个数最少的那一个;如果不存在,则输出-1。**数据范围**&nbsp;n,m小于1e5,x小于1e9。**样例**&nbsp;S&nbsp;=&nbsp;{1,&nbsp;2,&nbsp;4,&nbsp;8,&nbsp;16}&nbsp;查询&nbsp;7&nbsp;8&nbsp;32的期望结果分别为3&nbsp;4&nbsp;-1**当时做出的解题尝试以及思路回忆**:拿到题目觉得莫名像是最小线性筛,但是玩了一下样例之后发现不是这样的。没思路,先考虑简单一点的问题,“对于给定的子集T,验证其是否能覆盖1到x的所有数字”想法:对于T排序之后直接dp即可,不过x的范围是1e9,dp存不下,所以自顶向下记忆化搜索。好,思维没闲着,不过对于上面这个,子集T有2^2种可能,无法枚举,那如何做呢?基于上面做法,我们试试看贪心。对于查询x,每次选择S中≤x且最接近(x+1)/2的数num,将问题递归转化为解决1...max(num-1,&nbsp;x-num)。实现的话使用multiset和lower_bound进行二分查找,如果两边差值一样,优先使用较大的数字,否则选更靠近的那个#牛客AI配图神器#想了半天想到这个之后开始实现,实现完之后发现过不了样例,即&nbsp;反例:S={1,2,4,8,32},&nbsp;x=8时:我的贪心则会x=8第一次贪心选4,此时x=4;第二次贪2,此时x=2;第三次贪1,此时x=1。x大于0就会继续进while循环体,此时multiset找lowerbound的时候,较大的那一端选到的数字是8,大于x不予考虑,较小那一段没得数字了。即较大较小两端都没有可以选的数字了,break出while并输出-1无法继续选择导致失败,但正确解应为8,4,2,1**赛后反思**首先,其实可以写一个枚举然后验证的,这样如果有n&nbsp;&lt;&nbsp;30的数据点,至少可以拿一些部分分然后反思了我的贪心,应该自底向上贪心,初始cur=0,然后把S的所有元素全部插入到某一个数据结构中,由于选一个≤&nbsp;cur+1的num可以让cur&nbsp;=&nbsp;cur&nbsp;+&nbsp;num,所以我们就贪心选数据结构中所有≤&nbsp;cur+1元素中最大的那一个,更新cur,cnt,并从数据结构中删除被选择的数。如果cur大于等于查询x,返回cnr。如果数据结构中已经没有≤&nbsp;cur+1的数可以选就break输出-1数据结构选择multiset的时候,时间复杂度为mnlogn,还是超时,不过正确性来说,应该是对的,可以大概想象到贪心正确性证明长啥样。TODO&nbsp;正确性证明;考虑使用什么算法可以不超时。
投递淘天集团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客企业服务