这是六十分 代码
#include <iostream>
#include <cstdio>
#include <cmath>
#define MAXN 100005
using namespace std;
long long n, m;
long long p[MAXN], sum[MAXN];
struct str {
int a, b, c;
};
str number[MAXN];
int answer = 0;
int main () {
cin >> n >> m;
for (int i = 1;i <= m; ++i) {
cin >> p[i];
}
for (int i = 1;i <= n - 1; ++i) {
cin >> number[i].a >> number[i].b >> number[i].c;
}
for (int i = 1;i <= m - 1; ++i) {
int a = p[i];
int b = p[i + 1];
if (p[i] > p[i + 1]) {
a = p[i + 1];
b = p[i];
}
if (b == n) {
sum[a] += 1;
}
else {
sum[a] += 1;
sum[b] -= 1;
}
}
int Q = 0;
for (int i = 1;i <= n - 1; ++i) {
Q += sum[i];
sum[i] = Q;
}
for (int i = 1;i <= n - 1; ++i) {
int buy = number[i].c + ( number[i].b * sum[i] );
int Nbuy = number[i].a * sum[i];
answer += min (buy, Nbuy);
}
cout << answer << endl;
return 0;
}
这是100分代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#define MAXN 100005
using namespace std;
unsigned long long n, m;
unsigned long long p[MAXN], sum[MAXN];
struct str {
unsigned long long a, b, c;
};
str number[MAXN];
unsigned long long answer = 0;
int main () {
cin >> n >> m;
for (unsigned long long i = 1;i <= m; ++i) {
cin >> p[i];
}
for (unsigned long long i = 1;i <= n - 1; ++i) {
cin >> number[i].a >> number[i].b >> number[i].c;
}
for (unsigned long long i = 1;i <= m - 1; ++i) {
unsigned long long a = p[i];
unsigned long long b = p[i + 1];
if (p[i] > p[i + 1]) {
a = p[i + 1];
b = p[i];
}
if (b == n) {
sum[a] += 1;
}
else {
sum[a] += 1;
sum[b] -= 1;
}
}
unsigned long long Q = 0;
for (unsigned long long i = 1;i <= n - 1; ++i) {
Q += sum[i];
sum[i] = Q;
}
for (int i = 1;i <= n - 1; ++i) {
unsigned long long buy = number[i].c + ( number[i].b * sum[i] );
unsigned long long Nbuy = number[i].a * sum[i];
answer += min (buy, Nbuy);
}
cout << answer << endl;
return 0;
}
而且60分的代码是WA四个点。
就把所有int改为 unsigned long long,就就就过啦?现在瘫在电脑前,MB中。。。
大哥,有必要吗(doge)