常见错误

1.读入过程中直接break,导致数据没读完

一般是根据读入的数据已经判断出无解
如果只有一组数据倒是没所谓,但是多组数据就会出很大问题

2.有些情况不需要更新答案,但是需要更新其他的数据

fo(i,1,ans) {
		if (s[i]+x*ans+(ll)(ans-i)*x>t)	continue;
		z-=(ll)(ans-i+1)*x;
		z+=(ll)(ans-i+1)*a[i];
		sum=min(sum,z+(ll)k*i);
	}

此处如果判断条件不合法就直接continue,没有考虑到虽然不能更新答案,但是z是需要更新的。正确代码如下

fo(i,1,ans) {
		z-=(ll)(ans-(ll)i+1ll)*x;
		z+=(ll)(ans-(ll)i+1ll)*a[i]; 
		if (s[i]+x*ans+(ll)(ans-i)*x>t)	continue;
		sum=min(sum,z+k*(ll)i);
	}

3.add函数没有考虑到有负数情况

void add(ll &x,ll y){
	x=(x+y>=p) ? (x+y-p):(x+y);
}

add函数一般是在取模的时候用到,为了减少%运算带来的常数,但是有的时候又出现负数,如果直接用add,就有可能溢出,所以就要另外写一个sub函数

void sub(int &x,int &y){
	x=(x-y<0) ? (x-y+p) : x-y;
}

另外int 运算也会比ll快一些,在计算量较大的情况下在评测机上尤为明显,但在本机上相差不大,这是需要注意的。

4. inf设置不合理

对于int的情况,经常习惯性的

const int inf=1<<30;

但是两个都是inf的时候加起来就爆了

posted @ 2023-01-29 10:57  gan_coder  阅读(32)  评论(0)    收藏  举报