C++洛谷P5661,[CSP-J2019]公交换乘题解+de小bug

C++洛谷P5661,[CSP-J2019]公交换乘题解+de小bug

C++洛谷P5661,[CSP-J2019]公交换乘题解+de小bug_第1张图片
C++洛谷P5661,[CSP-J2019]公交换乘题解+de小bug_第2张图片C
C++洛谷P5661,[CSP-J2019]公交换乘题解+de小bug_第3张图片


思路

算法:队列,模拟。

重点:读入每一张有效优惠券的终止时间,价格。
模拟每一条公交车记录是否可以用票抵消。
如果可以,用最早的有效优惠票
否则,用钱买车票。


Code:

#include
#include
using namespace std;
struct piao {
	int p;
	int t;
};
piao a[100005];
int n;
int by,price,Tme;
int main() {
	int head=0,tail=0;
	int ans=0;
	cin>>n;
	for(int i=1;i<=n;i++) {
		cin>>by>>price>>Tme;
		while(head<=tail) {
			if(a[head].t<Tme) {
				head++;
			} else {
				break;
			}
		}
		if(by==1) {
			bool flag=false;
			for(int j=head;j<=tail;j++) {
				if(a[j].p>=price) {
					a[j].p=0;
					flag=true;
					break;
				}
			}
			if(!flag) {
				ans+=price;
			}
		} else {
			ans+=price;
			++tail;
			a[tail].p=price;
			a[tail].t=Tme+45;
		}
	}
	cout<<ans<<endl;    
	return 0;
}





里面有一个很难察觉的BUG(测试点体现不出来,做别的题可能会体现出来)
代码中

int head=0,tail=0;

while(head<=tail)

++tail;
a[tail].p=price;
a[tail].t=Tme+45;

是不是很矛盾?

所以,我们先要把它改一改,为了能记住这个点,我也要把它分分类。


(改法)
改法一:

int head=0,tail=0;
--> int head=0,tail=-1;
//为什么?
while(head<=tail)//注意等号

改法二:

while(head<=tail)
-->while(head<tail)

(分类)
用队尾来分类:

1.队尾指向空位置:head=tail-1,入队时先操作,队尾再加1.

int head=0,tail=1;

a[tail].p=price;
a[tail].t=Tme+45;
++tail;

2.队尾指向队列最后一个元素:head=tail,入队时队尾先加1,再操作.

int head=0,tail=0;

++tail;
a[tail].p=price;
a[tail].t=Tme+45;

你可能感兴趣的:(CSP-J2019,c++题解·,算法小讲)