• Codeforces Round #608 (Div. 2)D(贪心)


     1 #define HAVE_STRUCT_TIMESPEC
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 int a[5007],b[5007],c[5007];
     5 int u,v;
     6 int remain[5007],least[5007];
     7 pair<int,int>pc[5007];
     8 vector<int>road[5007];
     9 bool cmp(int a,int b){
    10     return a>b;
    11 }
    12 int main(){
    13     ios::sync_with_stdio(false);
    14     cin.tie(NULL);
    15     cout.tie(NULL);
    16     int n,m,k;
    17     cin>>n>>m>>k;
    18     for(int i=1;i<=n;++i){
    19         cin>>a[i]>>b[i]>>c[i];
    20         pc[i]={c[i],i};
    21     }
    22     for(int i=1;i<=m;++i){
    23         cin>>u>>v;
    24         road[v].push_back(u);
    25     }
    26     int num=k;
    27     int flag=0;
    28     for(int i=1;i<=n;++i){
    29         if(num>=a[i]){
    30             num+=b[i];
    31         }
    32         else{
    33             flag=1;
    34         }
    35     }
    36     if(flag){
    37         cout<<-1;
    38         return 0;
    39     }
    40     least[n]=a[n];//当前至少要有的士兵数量,否则就算以后全部招募且不派兵防守也无法攻下所有城堡
    41     for(int i=n-1;i;--i){
    42         least[i]=least[i+1]-b[i];
    43         least[i]=max(a[i],least[i]);
    44     }
    45     for(int i=n;i;--i){
    46         remain[i]=num-least[i+1];//当前可以用来防守的士兵数量
    47         num-=b[i];
    48     }
    49     int ans=0;
    50     sort(pc+1,pc+1+n);
    51     for(int i=1;i<=n;++i){
    52         road[i].push_back(i);
    53         sort(road[i].begin(),road[i].end(),cmp);
    54     }
    55     for(int i=n;i;--i){
    56         int x=pc[i].first,y=pc[i].second;
    57         for(auto it:road[y]){
    58             if(remain[it]>0){
    59                 int flag=0;
    60                 for(int j=it;j<=n;++j)
    61                     if(remain[j]==0){
    62                         flag=1;//如果后面有等于0的话,这里派兵防守,后面就不够攻打城堡了
    63                         break;
    64                     }
    65                 if(!flag){
    66                     ans+=x;
    67                     for(int j=it;j<=n;++j)
    68                         --remain[j];
    69                 }
    70                 break;
    71             }
    72         }
    73     }
    74     cout<<ans;
    75     return 0;
    76 }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    Insertion Sort Gym
    Codeforces Round #524 (Div. 2) C. Masha and two friends 思路
    PTA 数据结构——是否完全二叉搜索树
    Crane UVA
    Unidirectional TSP UVA
    排序二叉树的建立,查询与删除
    The Tower of Babylon UVA
    DAG上的动态规划——嵌套矩阵问题
    Paper Folding UVA
    多图片上传插件
  • 原文地址:https://www.cnblogs.com/ldudxy/p/12046834.html
Copyright © 2020-2023  润新知