• 2019.3.29


    贪心:一直超时,查了后发现要标记.

    不过sun和v不写>0会出错?

    http://poj.org/problem?id=3040

     1 #include<iostream>
     2 #include<cmath>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 #define N 15000
     7 #define ll long long
     8 #define inf 0x3f3f3f3f
     9 #define mem(a) memset(a,0,sizeof(a))
    10 struct node{
    11  int x,y;
    12 }f[25],g;
    13 int main()
    14 {
    15     int n;
    16     int c,ans=0;
    17     cin>>n>>c;
    18     int t=n;
    19     for(int i=1;i<=t;i++)
    20     {
    21         cin>>f[i].x>>f[i].y;
    22         if(f[i].x>=c) {ans+=f[i].y;i--;t--;}
    23     }
    24     for(int i=1;i<t;i++)
    25     {
    26         for(int j=i+1;j<=t;j++)
    27         {
    28             if(f[i].x<f[j].x)
    29             {
    30               g=f[i];
    31               f[i]=f[j];
    32               f[j]=g;
    33             }
    34         }
    35     }
    36     int mark[25];
    37     while(1)
    38     {
    39         mem(mark);
    40         int sum=c;
    41         for(int i=1;i<=t;i++)
    42         {
    43             if(f[i].y&&sum>0)
    44             {
    45                 mark[i]+=min(f[i].y,sum/f[i].x);
    46                 sum-=f[i].x*mark[i];
    47             }
    48         }
    49         if(sum>0)
    50         {
    51             int v;
    52             for(int i=t;i>=1;i--)
    53             {
    54                 if(f[i].y&&sum>0)
    55                 {
    56                     v=min(f[i].y-mark[i],(sum+f[i].x-1)/f[i].x);// hou
    57                     if(v>0){
    58                       sum-=v*f[i].x;
    59                       mark[i]+=v;
    60                     }
    61                 }
    62             }
    63         }
    64         if(sum>0)break;
    65         int v=inf;
    66         for(int i=1;i<=t;i++)
    67         {
    68             if(mark[i])
    69             {
    70                 v=min(v,f[i].y/mark[i]);
    71             }
    72         }
    73         ans+=v;
    74         for(int i=1;i<=t;i++)
    75         {
    76             if(mark[i])
    77             {
    78                 f[i].y-=v*mark[i];
    79             }
    80         }
    81     }
    82   cout<<ans<<endl;
    83     return 0;
    84 }
    poj 3040 Allowance
  • 相关阅读:
    「题解」300iq Contest 2 B Bitwise Xor
    「题解」agc031_e Snuke the Phantom Thief
    「题解」agc031_c Differ by 1 Bit
    「题解」NWRRC2017 Joker
    「题解」NWRRC2017 Grand Test
    「题解」USACO15FEB Fencing the Herd G
    zsh: command not found:xxx 解决方法
    curl
    redis搭建
    http 缓存分为客户端缓存/服务端缓存/数据库缓存
  • 原文地址:https://www.cnblogs.com/XXrll/p/10623213.html
Copyright © 2020-2023  润新知