自己给自己挖的坑(未完待续)
1.http://codevs.cn/problem/5929/
原因:不读题,不读题,不读题,合并了错误节点,自以为是std写的天衣无缝,样例也AC,但是没有意识到样例是很水的,另外,挪用代码也是很不好的习惯。
2.QBXT两次考试
原因:cena的旧版编译器没有优化STL+cena对STL动态内存的兼容性,导致疯狂TLE...
3.http://poj.org/problem?id=1979
原因:初始节点忘记设置访问数组为已经访问过,导致在某些数据下会多输出1,然后bad fix这个bug,AC样例,然而样例太水,三组数据是一种类型,然后果断WA...后期自己造测试数据:
3 4 @... #### ####
成功多出一个点来(程序输出5,明显地应该输出4)。
果断重新调试并fix之,再次Submit,AC.
4.http://www.cnblogs.com/TheRoadToAu/p/7097726.html
原因:不读题,对STL了解不够,不清楚坑点,本来该用multiset用成了set,卡掉30分(70->40)...
5.https://www.luogu.org/problem/show?pid=1965
原因:没有对每一个运算数进行取模运算,以为不会Boom,结果Boom了long long,怎么也查不错来,一直30分...
1 #include<cstdio> 2 using namespace std; 3 4 inline long long FP(int a,int b,int mod) 5 { 6 if(b==0)return 1; 7 int ans=1,base=a; 8 while(b) 9 { 10 if(b&1) 11 ans=(ans*base)%mod; 12 base=(base%mod)*(base%mod)%mod; 13 b>>=1; 14 } 15 return ans; 16 } 17 18 int n,m,k,x; 19 int main() 20 { 21 scanf("%d%d%d%d",&n,&m,&k,&x); 22 printf("%lld\n",(m*FP(10,k,n)+x)%n); 23 return 0; 24 }
6.https://www.luogu.org/problem/show?pid=2278
原因:对于优先队列和重载运算符使用不熟练,本地CE……
以后尽量使用重载运算符而非结构体伪函数(节省代码量+看着顺眼)。
记得重载二元运算符的一般方式:
ReturnType operator Operator (const DataType &ArgumentName) const
{return this->member ...}
例如以下的重载运算符:
struct Process{ int PID,StartTime,ETA,Rank; bool operator < (const Process &b) const { return this->Rank<b.Rank||this->Rank==b.Rank&&this->PID>b.PID; } }ProcessList[1000000]; int n,rest,cnt=1,sz=0,time; priority_queue<Process> Q;
重载运算符的好处:对于优先队列,自定义数据类型不需要手写另外一个结构体(或定义一个类型)写伪函数,并写一个比较长的定义。
手写伪函数:
struct XY { int num,s,t,val; } v[1000000]; struct cmp { bool operator ()(XY &a,XY &b) { return a.val<b.val||a.val==b.val&&a.num>b.num; } }; priority_queue<XY,vector<XY>,cmp> Q;
7.
促销
【题目描述】
某某商场搞了一个促销活动,促销活动以以下方式进行:
- 一个想要参加活动的顾客将他的发票扔进抽奖箱里。
- 在每天的最后,从抽奖箱里抽出两张发票:
a) 金额最大的发票a
b) 金额最小的发票b
- 金额最大的发票的持有者得到a-b的奖金。
每天被抽出的发票都不会再被放回抽奖箱里。
你想知道促销活动结束时一共付出了多少奖金。
【输入格式】
第一行一个N,促销进行的天数;
接下来N行,第一个数是一个ki,表示第i天收到的发票数;接下来ki个数,每个数是一个发票的金额。
【输出格式】
一个数,整个促销活动过程中一共付出了多少奖金。
【输入输出样例】
promotion.in |
promotion.out |
5 3 1 2 3 2 1 1 4 10 5 5 1 0 1 2 |
19 |
【数据规模】
对于30%的数据,发票总数M不超过2000;
对于另外20%的数据,每张发票的金额不超过2000;
对于100%的数据,发票总数M不超过1000000,每张发票的金额不超过1000000。
原因:Cena...我不得不再次吐槽你一次...您不能用%lld算怎么回事啊23333...您换个别的编译器会死吗...我的50分就gg了...
solution:
#ifdef __WIN32
#define lld "%I64d"
#define llu "%I64u"
#else
#define lld "%lld"
#define llu "%llu"
#endif
以后用lld与llu替代“%lld”与“%llu”...
3.
原因:freopen, fclose, stdin, stdout在cstdio库里!!!不论何时都要引用cstdio,以防爆炸!!!
4.
原因:Windows下换行编码为\r\n,Linux下换行符为\n,CRT出了锅,数据在Windows下生成,结果读入字符时读入了一个'\n'.
solution: 不用scanf读入字符。直接读入字符串。
5.
原因:矩阵乘法不具有交换律!!!!!!!!矩阵乘法不具有交换律!!!!!!!!矩阵乘法不具有交换律!!!!!!!!矩阵乘法不具有交换律!!!!!!!!矩阵乘法不具有交换律!!!!!!!!矩阵乘法不具有交换律!!!!!!!!