luogu P5016 龙虎斗
模拟题,就没啥思路,模拟就是了。所以出一个DeBug日志。
最初代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;;
long long m,n,s1,s2,p1,p2;
long long c[100099];
long long str1,str2;
long long abs_(long long a){
return a > 0? a : -a;
}
int main(){
cin >> n;
for(long long i = 1;i <= n; i++){
cin >> c[i];
}
cin >> m >> p1 >> s1 >> s2;
for(long long i = 1;i <= n; i++){
if(i < m){
str1 += c[i] * (m - i);
}else if(i > m){
str2 += c[i] * (i - m);
}
}
if(p1 > m){
str2 += s1 * (p1 - m);
}
if(p1 < m){
str1 += s1 * (m - p1);
}
// cout << str1 << ' ' << str2 << endl;
long long ans = 1000000099;
for(long long i = 1;i <= n; i++){
long long k;// ①
if(i < m){
str1 += s2 * (m - i);
k = abs_(str1 - str2);
str1 -= s2 * (m - i);
}else if(i > m){
str2 += s2 * (i - m);
k = abs_(str1 - str2);
str2 -= s2 * (i - m);
}
if(ans > k){
ans = k;
p2 = i;
}
}
// cout << ans << ' ' << endl;
cout << p2 << endl;
return 0;
}
①处的代码一开始有问题,因为没有考虑到这个s2在m时,他不属于任何阵营,实际上就是自己原本的值。我们需要把这个自己的值放进去进行计算,实际上只需要每次生命k的时候,就把k的值赋值成原本的力量之差。然后再进行序号的更新就可以。
更改后的代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
long long m,n,s1,s2,p1,p2;
long long c[100099];
long long str1,str2;
long long abs_(long long a){
return a > 0? a : -a;
}
int main(){
cin >> n;
for(long long i = 1;i <= n; i++){
cin >> c[i];
}
cin >> m >> p1 >> s1 >> s2;
for(long long i = 1;i <= n; i++){
if(i < m){
str1 += c[i] * (m - i);
}else if(i > m){
str2 += c[i] * (i - m);
}
}
if(p1 > m){
str2 += s1 * (p1 - m);
}
if(p1 < m){
str1 += s1 * (m - p1);
}
// cout << str1 << ' ' << str2 << endl;
long long ans = 1000000099;
for(long long i = 1;i <= n; i++){
long long k = abs(str1 - str2);
if(i < m){
str1 += s2 * (m - i);
k = abs_(str1 - str2);
str1 -= s2 * (m - i);
}else if(i > m){
str2 += s2 * (i - m);
k = abs_(str1 - str2);
str2 -= s2 * (i - m);
}
if(ans > k){
ans = k;
p2 = i;
}
}
// cout << ans << ' ' << endl;
cout << p2 << endl;
return 0;
}