這道題看起來不難,實際上也不難,不過因爲一個數據範圍大小的問題,讓我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;
}