您的位置:首页 > 其它

SZU2

2016-03-13 10:51 127 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: