这道题看起来不难,实际上也不难,不过因为一个数据范围大小的问题,让我WA了三次,全部倒在test 11(眼睛不好~~~,惨痛的教训)。
题目大意:某个地方有 n 个城市,编号从 1 到 n,其中有 k 个都城,普通城市 i 和 i+1 及 i-1有道路相通,都城和所有城市都有道路相通。每个城市有自己的一个魅力值,城市之间的路费等于相连两个城市的魅力值乘积,求总的路费为多少。附链接:http://codeforces.com/problemset/problem/703/B。
大体思路:输入n个城市和k个都城,先计算出相邻的城市总路费再加上都城和普通城市的路费,注意道路重复问题,以及城市1和城市n的相邻城市的处理,还有,就是数据范围,用long long~~~~~~
以下是ac代码:
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=100005;
long long city[maxn];
int vis[maxn]; //标记都城
int main(){
memset(vis,0,sizeof(vis));
int n,k;
cin>>n>>k;
long long sum=0;
for(int i=0;i<n;i++){
cin>>city[i];
sum+=city[i];
}
long long result=0;
for(int i=0;i<n-1;i++)
result+=city[i]*city[i+1];
result+=city[n-1]*city[0];
//cout<<result<<endl;
int id;
for(int i=0;i<k;i++){
cin>>id;
--id;
int sum1=sum;
int left=(id-1+n)%n;
int right=(id+1)%n;
if(!vis[left])
sum1-=city[left];
if(!vis[right])
sum1-=city[right];
sum1-=city[id];
result+=sum1*city[id];
sum-=city[id];
vis[id]=1;
}
cout<<result<<endl;
return 0;
}