zoukankan      html  css  js  c++  java
  • 【CF1020C】Elections(贪心)

    题意:

    Berland地区的腐败现象非常常见。

    马上有一场选举,你事先知道了选民和政党的数量,分别为 n 和 m ,对于每一位选民,你知道他将要选举哪一个政党,

    不过,每一位选民都会在接受一定数额的金钱之后改变他的主意。如果你给第 i 位选民 ci 数额的比特币,他就会选举任何你希望他选举的政党。

    你的目的是让Berland的联合党赢得这场选举,联合党必须拥有比其它政党都多的选票,在此基础之上,你希望花费的比特币尽可能少。

    联合党为1号党

    n,m<=3e3,a[i]<=1e9

    思路:同ZOJ3715

    这个问题似乎没有全局的最优策略

    枚举获得胜利需要的票数k,花费为两部分之和:

    1.选票比1号多的党,选择其中花费最少的一些直到这些党的票数小于1号党

    2.如果第一步之后票数不够,在剩下的票中选择花费最少的将1号党的票数补到k

     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   11000
    21 #define MOD 1000000007
    22 #define eps 1e-8 
    23 #define pi acos(-1)
    24 
    25 struct arr
    26 {
    27     ll x,y;
    28 }a[N];
    29 
    30 ll c[N],d[N],flag[N];
    31 
    32 int read()
    33 { 
    34    int v=0,f=1;
    35    char c=getchar();
    36    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
    37    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
    38    return v*f;
    39 }
    40     
    41 
    42 bool cmp(arr a,arr b)
    43 {
    44     return a.y<b.y; 
    45 }
    46  
    47 int main()
    48 {
    49    // freopen("1.in","r",stdin);
    50     //freopen("1.out","w",stdout);
    51     int n,m;
    52     scanf("%d%d",&n,&m);
    53     for(int i=1;i<=n;i++) 
    54     {
    55         scanf("%lld%lld",&a[i].x,&a[i].y);
    56         c[a[i].x]++;
    57     }
    58     ll ans=3000000000000;
    59     sort(a+1,a+n+1,cmp);
    60     //for(int i=1;i<=n;i++) printf("%d %d
    ",a[i].x,a[i].y);
    61     for(int i=1;i<=n;i++)
    62     {
    63         ll tmp=0;
    64         ll now=0;
    65         for(int j=1;j<=m;j++) d[j]=c[j];
    66         for(int j=1;j<=n;j++) flag[j]=0;
    67         for(int j=1;j<=n;j++)
    68          if(a[j].x==1) now++; 
    69         for(int j=1;j<=n;j++) 
    70          if(d[a[j].x]>=i&&a[j].x!=1) 
    71          {
    72             tmp+=a[j].y;
    73             d[a[j].x]--;
    74             now++;
    75             flag[j]=1;
    76          }
    77          //printf("%d %lld
    ",now,tmp);
    78          if(now<i)
    79          {
    80              for(int j=1;j<=n;j++)
    81              {
    82                   if((!flag[j])&&(a[j].x!=1)) {tmp+=a[j].y; now++;}
    83                   if(now>=i) break;
    84              }
    85          }
    86          if(tmp<ans&&now>=i) ans=tmp;
    87         // printf("%d %lld
    ",i,tmp);
    88     }
    89     printf("%lld
    ",ans);
    90     return 0;     
    91 }
  • 相关阅读:
    Linux编程make命令(转)
    如何处理Global symbol * requires explicit package name编译错误,以及use strict用法
    6235与旧版本的区别
    Linux下动态链接库的使用
    MTK Socket学习——HTTP请求
    指针和指针的引用
    VC/MFC Combo Box控件的用法
    makefile教程
    常用数据类型使用转换详解
    Linux发送与接收信息
  • 原文地址:https://www.cnblogs.com/myx12345/p/9843293.html
Copyright © 2011-2022 走看看