题目
宁静的草原上一南一北坐落着两个美丽的村庄牛村和羊村。喜羊羊们瞎折腾把羊村的供水系统搞砸了,羊村村民没有饮用水危在旦夕,羊村村长打电话求助牛村村长,牛村火速派牛可乐和牛能给羊村送水。
牛可乐和牛能负责开车运送一辆装满矿泉水的大货车去羊村,在路上牛可乐和牛能如果渴了会直接饮用车上的矿泉水,如果碰到路人求水也会从车上舀水送给他,当他们到达羊村的时候车上的矿泉水总共重Y千克。
村长记得刚出发的时候总共有k桶一样大小的水,总重量小于等于n千克,请问从牛村到羊村路上牛可乐和牛能总共消耗了多少千克的水?
每桶水都为整数千克
输入描述:
输入一行,包含三个整数Y,k,n , 1<=Y,k,n<=109;n/k<=105
输出描述:
输出一行,输出可能消耗的水重量,用空格隔开。 如果不存在这样的重量,输出−1
示例1
输入
10 1 10
输出
0
示例2
输入
10 6 40
输出
2 8 14 20 26
该题难度不大,重在如何思考。
这道题的题眼在于——总重量小于等于n千克以及每桶水都为整数千克,初看十分懵逼,不知道该如何下手。
思路
单桶水质量(区间范围)
首先,需要考虑单桶水的重量是多少,如何求单桶水呢?题目所给的是刚出发时,总重量小于等于n,因此我们无法清楚得知单桶水的重量,只能知道在某个区间范围内,因此int x2<=(n/k);其次,到达时总重为Y,此Y可能为整桶水的重量也可能是几桶水加半桶水的重量,由于无法得知,我们同样的处理方法,int x1>=(y/k);
int x1=int(y/k);
int x2=n/k;
计算可能值
由于题目已经说明每桶水都为整数千克,可以利用for循环,从x1到x2,从而计算出可能的刚出发时候的总重量i*k,当总重量减去到达终点时的Y重量,便是途中消耗的重量。
for(int i=x1;i<=x2;i++)
{
if(i*k-y>=0)
{
int x=i*k-y;
cout<<x<<" ";
}
}
细节优化
依据题目中如果不存在这样的重量,输出−1,在什么时候会不存在这样的重量呢?即总重量<达到终点时的重量Y,此时输出-1。(n<Y)
if(x2*k-y<0) cout<<"-1"<<endl;
源代码
#include<iostream>
using namespace std;
int main()
{
int y,k,n;
cin>>y>>k>>n;
int x1=int(y/k);
int x2=n/k;
if(x2*k-y<0) cout<<"-1"<<endl;
else
{
for(int i=x1;i<=x2;i++)
{
if(i*k-y>=0)
{
int x=i*k-y;
cout<<x<<" ";
}
}
}
return 0;
}
对自己想说的,不存在与存在情况处于并列关系,因此 不存在情况不应该在for循环里面,因为压根不需要循环。