P5016龙虎斗
这道题是2018年普及组的第二题,是一个模拟题。
首先计算出双方各自的势力,然后将增援的队伍势力加上,比较此时双方势力,并且作差,最后枚举将公平兵加在哪一个兵营。看似简单的题被我20分钟就写完了,但是调了整整16次!对于“坑”值得警惕!
三个坑点:要用long long;当我copy龙的代替虎的时候一定要注意不再是m-p了,而是p-m了(m-ansp1与ansp2-m同理);当把公平兵全部加在一方时势力差可能要大于原有差,所以这时候也要加在中间。
1.复制代码时一定要考虑两个对象的不同计算,所以不多的话就不要复制前面的。
2.注意看运算结果的数据范围,小心被卡double ,long long...
3.一定要把整体过程把握好
4.不要把简单的题做简单了,想想还有什么情况,切忌盲目自信。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #define MAXN 100000 7 using namespace std; 8 int n; 9 int m;//中间阵营 10 long long force_d=0; 11 long long force_t=0; 12 long long soldier[MAXN+5]; 13 long long p1,s1,p2,s2; 14 long long disparity=0; 15 long long ansp1; 16 long long ansp2; 17 long long fabs(long long x){ 18 if(x>=0) return x; 19 else return -x; 20 } 21 int main(){ 22 cin>>n; 23 for(int i=1;i<=n;i++){ 24 cin>>soldier[i]; 25 } 26 cin>>m>>p1>>s1>>s2; 27 ansp1=1; 28 ansp2=m+1; 29 for(int i=1;i<=m-1;i++){//龙的势力 30 force_d=force_d+soldier[i]*(m-i); 31 } 32 for(int i=m+1;i<=n;i++){//虎的势力 33 force_t=force_t+soldier[i]*(i-m); 34 } 35 if(p1<=m-1&&p1<=n){//天降奇兵 36 force_d=force_d+s1*(m-p1); 37 } 38 else if(p1>=m+1&&p1<=n){ 39 force_t=force_t+s1*(p1-m); 40 } 41 else if(p1==m&&p1<=n){ 42 force_t=force_t; 43 force_d=force_d; 44 } 45 //cout<<"气势"<<force_d<<" "<<force_t<<" "; 46 if(force_t>force_d){//虎大,加在龙营 47 disparity=force_t-force_d; 48 for(int i=13;i<=m-1;i++){ 49 if(fabs(s2*(m-i)-disparity)<fabs(s2*(m-ansp1)-disparity)){ 50 ansp1=i; 51 } 52 } 53 //cout<<endl; 54 //cout<<abs(s2*(m-ansp1[cnt])-disparity); 55 if(disparity>fabs(s2*(m-ansp1)-disparity)) cout<<ansp1; 56 else cout<<m; 57 return 0; 58 } 59 else if(force_t<force_d){//龙大,加在虎营地 60 disparity=force_d-force_t; 61 for(int i=m+1;i<=n;i++){ 62 if(fabs(s2*(i-m)-disparity)<fabs(s2*(ansp2-m)-disparity)){ 63 ansp2=i; 64 } 65 } 66 // cout<<abs(s2*(m-ansp2[cnt])-disparity); 67 if(disparity>fabs(s2*(ansp2-m)-disparity)) cout<<ansp2; 68 else cout<<m; 69 return 0; 70 } 71 else if(force_t==force_d){ 72 cout<<m; 73 return 0; 74 } 75 76 }
待到oi十一月,我花开后百花杀。