1216B Shooting

好久都没做题了,昨天刚好有一场时间不晚的就来练习一下。

题意:一个练习射击,在桌子上摆了n个罐子,每个罐子都有一个耐久度,每一次需要罐子耐久度那么大的能量才能把罐子打碎,每一次射击的能量是ai*x+1的能量,ai是罐子的耐久度,x是次数,x是从0开始的,输出最小的能量吧所有罐子打破,然后输出按照原来序号罐子被射击的序号。

题解:总能量好算,直接排序,顺序,逆序都可以,计算能量逆序计算,因为ai是固定的,x随着后面越来越大,就让大的在前面,小的在后面能量最小,按照给的公式求和,麻烦的是输出原来罐子序号被射击的序号,这里c++需要到pair的东西,pair本质是结构体,所以这题Python需要用到zip  zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。或者enumerate   enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。把耐久的值和下标序号关联起来。

c++:

#include<bits/stdc++.h>
using namespace std;
pair<int,int>a[1010];
int main()
{
    int n,sum=0;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i].first,a[i].second=i;
    sort(a,a+n);
    for(int i=0;i<n;i++)
        sum+=i*a[n-i-1].first+1;
    cout<<sum<<endl;
    for(int i=n-1;i>=0;i--)
        cout<<a[i].second+1<<" ";
    return 0;
}

python:

n=input()
seq = [(v, i) for i, v in enumerate(map(int, input().split()))]
s_seq=sorted(seq,reverse=True)
print(sum(i*v[0]+1 for i,v in enumerate(s_seq)))
print(*[i[1]+1 for i in s_seq])

python:

n=int(input())
a=sorted(zip(map(int,input().split()),range(n)),reverse=True)#关联数和索引值 打包成元祖
print(sum([i*a[i][0]+1 for i in range(n)]))
print(*[i[1]+1 for i in a])
发布了395 篇原创文章 · 获赞 126 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/memory_qianxiao/article/details/101145962