zoukankan      html  css  js  c++  java
  • 【ZOJ4067】Books(贪心)

    题意:DG在书店买书,从左到右第i本书价格为ai

    DG从左走到右,能买就买。如果已知DG买了m本书,问他原本最多有多少钱。

    若无上限,输出“Richman”,若不可能买这么多书,输出“Impossible”。

    1 ≤ n ≤ 105,0 ≤ m ≤ n,0 ≤ ai ≤ 109

    思路:价格为0的书必买,若价格为0的数量>m则无解

    m=n则可以有无限钱

    剩余的情况m减去价格为0的数量,剩余的一定是前m-1个和后面所有的最小值-1之和

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<string>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<algorithm>
     7 #include<map>
     8 #include<set>
     9 #include<queue>
    10 #include<vector>
    11 using namespace std;
    12 typedef long long ll;
    13 typedef unsigned int uint;
    14 typedef unsigned long long ull;
    15 typedef pair<int,int> PII;
    16 typedef vector<int> VI;
    17 #define fi first
    18 #define se second 
    19 #define MP make_pair
    20 #define N      110000
    21 #define M      51
    22 #define MOD 1000000007
    23 #define eps 1e-8 
    24 #define pi     acos(-1)
    25 #define oo     1010000000
    26 
    27 int a[N];
    28 
    29 int main()
    30 { 
    31      int cas;
    32      scanf("%d",&cas);
    33      for(int v=1;v<=cas;v++) 
    34      {
    35         int n,m;
    36         scanf("%d%d",&n,&m);
    37         int s=0;
    38         for(int i=1;i<=n;i++) 
    39         {
    40             scanf("%d",&a[i]); 
    41             if(!a[i]) s++;
    42         }
    43         if(s>m) 
    44         {
    45             printf("Impossible
    ");
    46             continue;
    47         }
    48         if(n==m)
    49         {
    50             printf("Richman
    ");
    51             continue;
    52         }
    53         m-=s;
    54         ll ans=0;
    55         int k=0;
    56         if(m>0)
    57         {
    58             for(int i=1;i<=n;i++)
    59             {
    60                  if(a[i])
    61                 {
    62                      m--; ans+=a[i];
    63                 }
    64                 if(m==0){k=i; break;}
    65             }
    66         }
    67         int mn=oo;
    68         for(int i=k+1;i<=n;i++) 
    69          if(a[i]) mn=min(mn,a[i]);
    70         ans+=mn-1;
    71         printf("%lld
    ",ans);
    72     }
    73     return 0;
    74 }
    75     
  • 相关阅读:
    Flex 加载资源方式
    java在linux系统下开机启动无法使用sudo命令的原因
    Android SDK 1.5中文版 (Application基础—5)
    还原ORACLE DUMP 的值
    JAVA操作windows共享目录
    [C++] 解释一下m_pfnCreateObject
    Android SDK 1.5中文版 (Application基础—4)
    O7_DICTIONARY_ACCESSIBILITY&REMOTE_OS_AUTHENT
    Android SDK 1.5中文版 (Application基础—3)
    Android SDK 1.5中文版 (Application基础—2)
  • 原文地址:https://www.cnblogs.com/myx12345/p/10046088.html
Copyright © 2011-2022 走看看