一个木有思路的东东

james1990 2011-11-09 08:46:59

老师让幼儿园的小朋友排成一行,然后开始发水果。老师分发水果的方法是这样的:从左面第一个人开始,每隔2人发一个梨;从右边第一个人开始,每隔4人发一个苹果。如果分发后的结果有10个小朋友既得到了梨,又得到了苹果,那么这个幼儿园有多少个小朋友?
...全文
125 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[code=C/C++]#include <iostream>
#include <vector>

using namespace::std;

int main()
{
vector<int> ivec(10,0); //定义一个vector容器,容器元素的个数为学生的人数,初始化为10
int cnt=0; //定义变量Cnt用来统计总共有多少位学生既得苹果又得梨
do{
for(vector<int>::iterator iterFst=ivec.begin();iterFst!=ivec.end();iterFst++)
*iterFst=0; //先将容器中各元素赋值为0 (0表示学生既没有苹果,也没有梨)
cnt=0;
ivec.push_back(0);

for(vector<int>::iterator iterFst=ivec.begin();iterFst<ivec.end();iterFst++)
if((iterFst-ivec.begin())%3==0)
*iterFst+=1; //从第一个元素开始每个2个元素值加1 (相当于每隔两位学生发一个苹果)
for(vector<int>::iterator iterEnd=ivec.end()-1;iterEnd!=ivec.begin();iterEnd--)
if((ivec.end()-iterEnd-1)%5==0)
*iterEnd+=1; //从最后一个元素开始每个4个元素值加1 (相当于每隔四位学生发一个梨)

for(vector<int>::iterator iterFst=ivec.begin();iterFst!=ivec.end();iterFst++)
if(*iterFst==2) //最后统计值为2的元素个数 (相当于既得苹果又得梨的学生个数)
cnt++;
}while(cnt!=10); //当cnt值为10的时候跳出do-while循环

for(vector<int>::iterator iterFst=ivec.begin();iterFst!=ivec.end();iterFst++)
cout<<*iterFst<<" ";//输出最终vector容器中所有元素

cout<<"幼儿园的小朋友人数为"<<ivec.size()<<endl;
return 0;
}/code]
  • 打赏
  • 举报
回复
[code=C/C++]
#include <iostream>
#include <vector>

using namespace::std;

int main()
{
vector<int> ivec(10,0); //定义一个vector容器,容器元素的个数为学生的人数,初始化为10
int cnt=0; //定义变量Cnt用来统计总共有多少位学生既得苹果又得梨
do{
for(vector<int>::iterator iterFst=ivec.begin();iterFst!=ivec.end();iterFst++)
*iterFst=0; //先将容器中各元素赋值为0 (0表示学生既没有苹果,也没有梨)
cnt=0;
ivec.push_back(0);

for(vector<int>::iterator iterFst=ivec.begin();iterFst<ivec.end();iterFst++)
if((iterFst-ivec.begin())%3==0)
*iterFst+=1; //从第一个元素开始每个2个元素值加1 (相当于每隔两位学生发一个苹果)
for(vector<int>::iterator iterEnd=ivec.end()-1;iterEnd!=ivec.begin();iterEnd--)
if((ivec.end()-iterEnd-1)%5==0)
*iterEnd+=1; //从最后一个元素开始每个4个元素值加1 (相当于每隔四位学生发一个梨)

for(vector<int>::iterator iterFst=ivec.begin();iterFst!=ivec.end();iterFst++)
if(*iterFst==2) //最后统计值为2的元素个数 (相当于既得苹果又得梨的学生个数)
cnt++;
}while(cnt!=10); //当cnt值为10的时候跳出do-while循环

for(vector<int>::iterator iterFst=ivec.begin();iterFst!=ivec.end();iterFst++)
cout<<*iterFst<<" ";//输出最终vector容器中所有元素

cout<<"幼儿园的小朋友人数为"<<ivec.size()<<endl;
return 0;
}[/code>
ty502 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sukiida 的回复:]

楼上好复杂。
从左往右考虑,从第一个兼得者开始,很容易得到向右每3*5=15个小朋友会出现一个兼得者。所有兼得者之间应该一共有1+15*(10-1)=136个小朋友。再向左右补全最左和最右的几个小朋友就行。答案看起来不唯一吧。
[/Quote]


我的程序运行出来的结果是139
苏客达 2011-11-10
  • 打赏
  • 举报
回复
楼上好复杂。
从左往右考虑,从第一个兼得者开始,很容易得到向右每3*5=15个小朋友会出现一个兼得者。所有兼得者之间应该一共有1+15*(10-1)=136个小朋友。再向左右补全最左和最右的几个小朋友就行。答案看起来不唯一吧。
libralibra 2011-11-10
  • 打赏
  • 举报
回复
左右各是一个等差数列
左:a1=1,d=3
右:a1=1,d=5
然后公共项10个
代码:


>>> a = range(1,200,3)
>>> b = range(1,200,5)
>>> c = [x for x in a if x in b]
>>> c[9]
136
>>> c
[1, 16, 31, 46, 61, 76, 91, 106, 121, 136, 151, 166, 181, 196]


答案136

不过直觉,如果间隔不一定整除人数的话,是不是人数可以是一个范围?
136~150都可以吧?没仔细想
ty502 2011-11-09
  • 打赏
  • 举报
回复
#include <iostream>
#include <vector>

using namespace::std;

int main()
{
vector<int> ivec(10,0); //定义一个vector容器,容器元素的个数为学生的人数,初始化为10
int cnt=0; //定义变量Cnt用来统计总共有多少位学生既得苹果又得梨
do{
for(vector<int>::iterator iterFst=ivec.begin();iterFst!=ivec.end();iterFst++)
*iterFst=0; //先将容器中各元素赋值为0 (0表示学生既没有苹果,也没有梨)
cnt=0;
ivec.push_back(0);

for(vector<int>::iterator iterFst=ivec.begin();iterFst<ivec.end();iterFst++)
if((iterFst-ivec.begin())%3==0)
*iterFst+=1; //从第一个元素开始每个2个元素值加1 (相当于每隔两位学生发一个苹果)
for(vector<int>::iterator iterEnd=ivec.end()-1;iterEnd!=ivec.begin();iterEnd--)
if((ivec.end()-iterEnd-1)%5==0)
*iterEnd+=1; //从最后一个元素开始每个4个元素值加1 (相当于每隔四位学生发一个梨)

for(vector<int>::iterator iterFst=ivec.begin();iterFst!=ivec.end();iterFst++)
if(*iterFst==2) //最后统计值为2的元素个数 (相当于既得苹果又得梨的学生个数)
cnt++;
}while(cnt!=10); //当cnt值为10的时候跳出do-while循环

for(vector<int>::iterator iterFst=ivec.begin();iterFst!=ivec.end();iterFst++)
cout<<*iterFst<<" ";//输出最终vector容器中所有元素

cout<<"幼儿园的小朋友人数为"<<ivec.size()<<endl;
return 0;
}

代码看起来有点复杂,但是思想是最简单直观的……
iamnobody 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 p1079854874 的回复:]
注意是两次分发的方向不同呢
[/Quote]

那么就假设我说的那个最左边的那个是兼得者中最左边的一个。

之后也很容易做了。。。
james1990 2011-11-09
  • 打赏
  • 举报
回复
注意是两次分发的方向不同呢
iamnobody 2011-11-09
  • 打赏
  • 举报
回复
每隔2个发一个梨,得梨小朋友满足:n1 = 1 + 3n (n是整数)
同理得得苹果小朋友: n2 = 1 + 5m;(m是整数)
兼得者:
n1 = n2
=>
3n = 5m;
于是
兼得者满足:

n3 = 1 + 15n(n是自然数)
得:
n = 0,1,2,...,9;
总数在[1+15*9,1+15*10)区间内

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧