非常好的一道模拟题
刚开始题目愣是没看懂
其实搞明白写出来很快的
刚好能支付的,记录下来!
有零钱找的
要调那种给出租车司机钱最少的,但够数,而且是多给的
开两个vector记录多给的start和end,不断找,更新多给的钱,一有能少给点的就清空之前所有的值并记录下来
比如比如
5 13
2 4 5 7 9
第一步 2 <13 给钱太少
第二步 6 <13 给钱太少
第三步 11<13 给钱太少
第四步 18>13 给那么多啊,记下来记下来 1-4
第五步 18-2=16>13 好像我还可以少给一点,之前的说话不算话,记下来!2-4
第六步 16-4=12<13 给少了 start=2
跳出循环
第七步 12+9=21>13 给多了 差8 不记录 start=3
第八步 21-5=16 start=3 差3,记下来!!! 3-5
第九步 16-7=9 给少了
打印输出
程序结束
return 0;
有些地方可能语义不清,直接看程序理解吧(
#include <cstdio>
#include <vector>
using namespace std;
int main(){
int n,total;
scanf("%d%d",&n,&total);
int diamonds[n];
vector<int> v_start;
vector<int> v_end;
for(int i=0;i<=n-1;i++){
scanf("%d",&diamonds[i]);
}
int flag=0;
int sum=0;
int start=1;
int diff=10000;
for(int i=0;i<=n-1;i++){
sum+=diamonds[i];
if(sum==total){
printf("%d-%d\n",start,i+1);
flag=1;
sum-=diamonds[start-1];
start++;
}
else if(sum>total){
while(sum>total){
if((sum-total)<diff){//差值出现了最小的,清空前面所有的值
v_start.clear();
v_end.clear();
v_start.push_back(start);
v_end.push_back(i+1);
diff=sum-total;//更新最小差值
}
else if((sum-total)==diff){//与前面的差值相同,则保存值
v_start.push_back(start);
v_end.push_back(i+1);
}
sum-=diamonds[start-1];
start++;
}
if(sum==total){
printf("%d-%d\n",start,i+1);
flag=1;
sum-=diamonds[start-1];
start++;
}
}
}
if(!flag){
for(int i=0;i<=v_start.size()-1;i++){
printf("%d-%d\n",v_start[i],v_end[i]);
}
}
return 0;
}