SZU2

CF:Problem 425A

区间暴力,枚举区间。交换选定区间最小值和剩余区间最大值k次。

其实等同于将剩余区间最大k个加到选定区间里,然后排序

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue

int a[205];
int n,k;

int main()
{
     int i,j,m;
     while(sf("%d%d",&n,&k)==2)
     {
          for(i =0;i<n;i++)
               sf("%d",&a[i]);

          int mx=-1000;

          for(i =0;i<n;i++)
          {
               for(j =i;j<n;j++)
               {
                    vector<int> p,q;
                    for(m=0;m<n;m++)
                    {
                         if(m<i||m>j) p.pb(a[m]);//p剩余区间
                         else q.pb(a[m]);//q选定区间
                    }
                    sort(p.rbegin(),p.rend());//rbegin反向迭代器
                    for(m=0;m<k&&m<p.size();m++)
                         q.pb(p[m]);
                    sort(q.rbegin(),q.rend());
                    int sum=0;
                    for(m=0;m<=j-i;m++) sum+=q[m];
                    if(sum>mx) mx=sum;
               }
          }

          pf("%d\n",mx);
     }
}

 

CodeForces 363D

这题其实是二分法。需要买最多的车,判断能不能买k辆车的话,一定是钱最多的k个人,买最便宜的k辆车,然后二分查找找出最大k

第二条件即花钱最少其实可以算出来,最关键还是k的大小

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue

int b[100005],p[100005];
int n,m,a;

bool ok(int k)
{
     int aa = a;
     int d=n-k;
     for(int i=0;i<k;i++)
     {
          if(b[i+d]<p[i])
               aa-=(p[i]-b[i+d]);
          if(aa<0) return false;
     }
     return true;
}

int main()
{
     int i,j;
     while(sf("%d%d%d",&n,&m,&a)==3)
     {
          for(i=0;i<n;i++) sf("%d",&b[i]);
          for(i=0;i<m;i++) sf("%d",&p[i]);
          sort(b,b+n);
          sort(p,p+m);
          int l=0,r=min(n,m),mid;
          while(l<=r)
          {
               mid = (l+r)>>1;
               if(ok(mid)) l=mid+1;
               else r=mid-1;
          }
          int s =0;
          for(i=0;i<l-1;i++)
               s+=p[i];
          pf("%d %d\n",l-1,s-a);
     }
}

 

posted @ 2016-03-13 10:51  qlky  阅读(202)  评论(0编辑  收藏  举报