永发信息网

ACM简单题目。。C语言求教

答案:3  悬赏:30  手机版
解决时间 2021-03-21 20:17
  • 提问者网友:你独家记忆
  • 2021-03-21 05:37
节假日到了,某商场搞促销活动,边同学是个购物狂,听到这个消息,他就想乘此机会大购一把。他带了n元钱到了商场,发现自己很幸运,因为有3样自己最想要的东西,价格降的最多了。于是就决定把所有的钱用来买这3样东西,一元也不多出, 一元也不少花。

3样东西和价格分别是:

苹果:5元 1斤

饼干:7元1箱

葡萄干:3元1斤

钱是有了,买什么也想好了。但是他遇到的问题是怎么搭配才能把钱花完并且每种东西至少买一样。在这个基础上,他在决定哪个买多,那个买少一点。请你帮他解决这个问题。

输入:

一个cases 只有一个n( 1 <= n <= 500 ),有多组cases,以文件结束为结尾。

输出:

如果能全部花完,则输出这样全部花完可能的次数,并且每次输出相应的个数,格式如下:

2 (表示种数)

2 6 8 ( 分别表示 苹果 饼干 葡萄干 的个数 )

5 6 3

输出中间用空格格开,最后没有空格。如果有多组符合条件的分配的话,按字典序排序输出(即先按苹果数目排序输出,如果苹果数目相等,再按饼干数目排序输出,以此类推)。

如果不存在符合条件的分配,就打印:IMPOSSIBLE.

每组cases后面有一个空行。

Sample:

Input:

15

10

Output:

1

1 1 1

IMPOSSIBLE.

本人代码:
#include
using namespace std;
int money ;
int i,j,k;//5 7 3
struct output
{
int a;
int b;
int c;
}mdq[1000];

void ConputAndOutput()
{
int sum,m = 0;
for(i=1;; i++)
{
sum =10+i*5;
if(sum>money) break;
for(j=1;;j++)
{
sum = i*5+j*7 +3;
if(sum>money) break;
for(k=1;;k++)
{
sum = i*5+7*j+k*3;
if(sum>money) break;
if(sum == money)
{
mdq[m].a = i ;
mdq[m].b = j ;
mdq[m].c = k ;
m ++;
}

}//k++
}//j++
}//i++
if(m!=0)
cout< for(i=0;i {
cout< }
if(m==0)
cout<<"IMPOSSIBLE."<}
int main()
{
while(cin>>money)
{
ConputAndOutput();
cout< }
return 0;
}

结果超时。。。求更好的算法,不让超时。。

本题是单文件多case输入。。。呵呵。。。
最佳答案
  • 五星知识达人网友:杯酒困英雄
  • 2021-03-21 06:56
#include
#include
using namespace std;
int main()
{
int a[1000][3];
int num=0;
int n;

while(1)
{
bool ans=false;
cin>>n;
for(int i=1;i<=floor(n/5);i++)
for(int j=1;j<=floor(n/7);j++)
for(int k=1;k<=floor(n/3);k++)
{
if(5*i+7*j+3*k==n)
{
num++;
a[num][0]=i;
a[num][1]=j;
a[num][2]=k;
ans=true;
break;//节省时间
}
}

if(ans==false)
cout<<"IMPOSSIBLE";
else
{
cout< for(int ii=1;ii<=num;ii++)
cout< }
}
return 0;
}
全部回答
  • 1楼网友:撞了怀
  • 2021-03-21 08:45
不知道你们的oj系统是支持__int64还是long long,因为n的三次方已经超过了int所能表示的范围,所以我们要把结果定义成__int64或者long long型的。代码如下: #include int main() {         __int64 n,s;         while(scanf("%i64d",&n)!=eof) {            s=0; if(n<=2500) {      s=(n*(n+1)*(2*n+1))/6;             printf("%i64d\n",s); } } return 0; }或者: #include int main() {         long long n,s;         while(scanf("%ild",&n)!=eof) {            s=0; if(n<=2500) {      s=(n*(n+1)*(2*n+1))/6;             printf("%lld\n",s); } } return 0; }
  • 2楼网友:有你哪都是故乡
  • 2021-03-21 07:57
#include using namespace std; int main() { int a[200],b[200],c[200]; int i,j,k,m,n; cin >> n; a[1]=5;b[1]=7;c[1]=3; for (i=1;i<=n / 5;i++) a[i]=a[i-1]+a[1]; for (i=1;i<=n/7;i++) b[i]=b[i-1]+b[1]; for (i=1;i<=n/3;i++) c[i]=c[i-1]+c[1]; for (i=1;i<=n/5;i++) { for (j=1;j<=(n-i*5)/7;j++) { for (k=1;j<=(n-i*5-j*7)/3;k++) { if ((a[i]+b[j]+c[k])==n) cout <
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯