Mishka and trip(CF #365 Div. 2)

29 篇文章 0 订阅
11 篇文章 0 订阅

这道题看起来不难,实际上也不难,不过因为一个数据范围大小的问题,让我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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值