2、小丽好朋友的生日快到了,她打算做一些折纸放在幸运罐中作为生日礼物。小丽计划总共 需要a颗星星以及b只纸鹤。现在市场上卖的到的星星纸(折小星星的专用纸)一张可以折c颗小星星,一张纸鹤纸(折纸鹤的专用纸)可以折d只小纸鹤。她准备一共买k张折纸,要优先满足星星纸的需求,剩余的再去买纸鹤纸,请你帮忙计算一下,买来的k张折纸能否满足小丽的折纸需求,能满足的话分别给出需要购买的星星纸和纸鹤纸的数量,不能的话则输出-1。若有满足条件的折纸方案,星星优先折叠,剩下的折纸都属于纸鹤。
输入格式 第一行输入一个整数T,表示共有T组情况需要判断。 接下来T行,每行包含5个整数a,b,c,d,k。 其中1<=T,a,b,c,d,k<=100
输出格式 输出T行,如果可以满足要求,输出两个整数x,y以空格分隔,分别表示需要采购的星星纸数量和纸鹤纸数量。 如果不存在合理方案,输出-1。
输入输出样列 输入样例1:
1 10 6 3 4 6
输出样例1:
4 2
输入样例2:
3 7 5 4 5 8 7 5 4 5 2 20 53 45 26 4
输出样例2:
2 6 -1 1 3
思路
首先,读取输入的组数T,并进行循环处理每一组情况。在每组情况中,读取需要的星星数量a、纸鹤数量b、星星纸折叠数量c、纸鹤纸折叠数量d以及可购买的折纸数量k。 接下来,使用函数panduan判断需要购买的星星纸数量,根据星星纸折叠数量c和需要的星星数量a计算出所需的星星纸张数t。如果需要购买的折纸数量k大于t,则进一步判断剩余的折纸能否满足纸鹤的需求。 如果剩余的折纸数量大于等于b所需的纸张数量,说明可以满足需求,输出所需的星星纸数量t和剩余的折纸数量k-t即可。否则,输出-1表示无法满足需求。 最后,循环结束后返回0,表示程序正常结束。
AC:
#include<stdio.h> int panduan(int a,int b)//a/c可能是小数,而纸数为整数 {int t;if(a%b!=0){t=a/b+1;}else{t=a/b;}return t; } int main() {int n;int a,b,c,d,k;scanf("%d",&n);while(n--){scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);int t=panduan(a,c);if(k>t){if((k-t)*d>=b){printf("%d %d\n",t,(k-t));}else{printf("-1\n");}}else{printf("-1\n");}}return 0;}
简化代码:
#include <stdio.h> int main() {int T;scanf("%d", &T);while (T--){int a, b, c, d, k;scanf("%d %d %d %d %d", &a, &b, &c, &d, &k);int x = (a + c - 1) / c; // 计算需要引入的星星纸数量if (x > k){printf("-1\n");}else{int y = (b + d - 1) / d * (k - x); // 计算需要的纸鹤纸数量printf("%d %d\n", x, y);}}return 0; }