首页 > 代码库 > hdu 6011

hdu 6011

题意:Lotus有nn种字母,给出每种字母的价值以及每种字母的个数限制,她想构造一个任意长度的串。定义串的价值为:第1位字母的价值*1+第2位字母的价值*2+第3位字母的价值*3……求Lotus能构造出的串的最大价值。(可以构造空串,因此答案肯定≥0)

思路:一开始想着以价值排序,小于0的不要,然而如果添加负数,那么有可能正数往后移,sum值反而更大

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 struct node{
 5     int x,y;
 6 }a[30];
 7 
 8 bool cmp(node p,node q){
 9     return p.x>=q.x;
10 }
11 int main(){
12     int t;
13     scanf("%d",&t);
14     while(t--){
15         int n;
16         scanf("%d",&n);
17         for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
18         ll xx=0,sum=0;
19         sort(a+1,a+1+n,cmp);
20         for(int i=1;i<=n;i++){
21             if(a[i].x>=0){
22                 while(a[i].y){
23                     xx+=a[i].x;
24                     sum+=xx;
25                     a[i].y--;
26                 }
27             }
28             else {
29                 while(a[i].y){
30                     xx+=a[i].x;
31                     if(xx<0) break;
32                     sum+=xx;a[i].y--;
33                 }
34             }
35         }
36         cout<<sum<<endl;
37     }
38     return 0;
39 }

 

nn种字母,给出每种字母的价值以及每种字母的个数限制,她想构造一个任意长度的串。 定义串的价值为:第1位字母的价值*1+第2位字母的价值*2+第3位字母的价值*3…… 求Lotus能构造出的串的最大价值。(可以构造空串,因此答案肯定\geq 00)

hdu 6011