//仅以此题,纪念自己的模拟之路的开始,大部分的注释都是debug过程中的
//先确定所需要的服务器的最小数量cnt,即从大到小先排个序,累加求出>=m的cnt的值,然后在电压为低电平的时候即s数组
//中的a值累加,记录一个k值表示累加的数的个数,
//1)如果k>cnt,则表示当前的低电平的数量多并且性能比较差,能力比较小.
//所以将大于cnt的部分去除,并且此时肯定是不够m的,所以依次将低电平数组的a
//去除,即减去a值,然后依次将高电平的未取出的最大值与低电平中已经取出的最小的值替换,
//这样最终就是我们要的答案。
//2)如果k<cnt,那么首先我们累加cnt-k的部分到sum中,如此之后,我们还要考虑如果当前的
//sum还是小于题目所要求的m的话再依次将高电平的未取出的最大值与低电平中已经取出的最小
//的值替换,这样最终就是我们要的答案。
用了两个多小时的时间,最后终于ac啦~哈哈哈哈,还是挺高兴的呢,模拟之路开启,继续练吧
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#define ceil(a,b) (((a)+(b)-1)/(b))
#define endl '\n'
#define gcd __gcd
#define highBit(x) (1ULL<<(63-__builtin_clzll(x)))
#define popCount __builtin_popcountll
typedef long long ll;
using namespace std;
const int MOD = 1000000007;
const long double PI = acos(-1.L);
template<class T> inline T lcm(const T& a, const T& b) { return a/gcd(a, b)*b; }
template<class T> inline T lowBit(const T& x) { return x&-x; }
template<class T> inline T maximize(T& a, const T& b) { return a=a<b?b:a; }
template<class T> inline T minimize(T& a, const T& b) { return a=a<b?a:b; }
template<class T> inline void unify(const T& c) {
c.resize(unique(c.begin(), c.end())-c.begin());
}
const int maxn = 2e5+6;
struct node {
ll a;
int l;
int id;
bool operator <(const node &x) const {
if (a!=x.a)
return a<x.a;
return l<x.l;
}
}s[maxn],y[maxn];
bool cmp(node &a,node &b){
// if (a.a!=b.a)
return a.a>b.a;
}
int n;
int low;
ll m;
priority_queue<node> q;
int cnt;
int cnts;
int cnty;
void init(){
while(!q.empty()) q.pop();
// while(!p.empty()) p.pop();
ll a;
int b;
cnts=0;
cnty=0;
for (int i=0;i<n;i++){
scanf("%lld%d",&a,&b);
if (b==1)
s[cnts++]=(node){a,b,i+1};
else {
y[cnty++]=(node){a,b,i+1};
}
q.push((node){a,b,i+1});
//printf("x=%lld %d %d\n",s[i].a,s[i].l,s[i].id);
}
// while(!p.empty()){
// node x = p.top();
// p.pop();
// printf("x=%lld %d %d\n",x.a,x.l,x.id);
// }
// puts("");
// while(!q.empty()){
// node x = q.top();
// q.pop();
// printf("x=%lld %d %d\n",x.a,x.l,x.id);
// }
cnt=0;
}
void print(int k,int l){
printf("%d %d\n",cnt,k);
int flag=false;
for (int i=0;i<k;i++){
if (flag)
printf(" ");
printf("%d",s[i].id);
flag = true;
}
for (int i=0;i<l;i++){
if (flag)
printf(" ");
printf("%d",y[i].id);
flag=true;
}
puts("");
}
void p(node s[],int n){
for (int i=0;i<n;i++)
printf("i=%d,x=%lld %d %d\n",i,s[i].a,s[i].l,s[i].id);
puts("");
}
void solve(){
sort(s,s+cnts,cmp);
sort(y,y+cnty,cmp);
// p(s,cnts);
// p(y,cnty);
// ll sum=m;
node x;
// int flag1=false,flag2=false;
low=0;
// while(!p.empty()){
// x=p.top();
// s[cnt++]=x;
// low++;
// // printf("low=%d x=%lld %d %d\n",low,x.a,x.l,x.id);
// p.pop();
// m-=x.a;
// if (m<=0){
// flag1=true;
// break;
// }
// }
// if (flag1){
// print();
// return ;
// }
ll sum=0;
while(!q.empty()){
node x = q.top();
q.pop();
sum = sum+x.a;
cnt++;
if (sum>=m)
break;
}
sum=0;
int k=0;
int l=0;
for (int i=0;i<cnts;i++){
sum+=s[i].a;
k++;
if (sum>=m)
break;
}
// printf("k=%d\n",k);
// printf("cnts=%d\n",cnts);
// printf("cnty=%d\n",cnty);
//int o=k;
// printf("cnt=%d\n",cnt);
if (k>cnt){
for (int i=cnt;i<k;i++)
sum-=s[i].a;
k=cnt;
while(sum<m){
sum-=s[k-1].a;
k--;
// printf("k=%d\n",k);
sum+=y[l++].a;
}
print(k,l);
}else {
l=cnt-k;
for (int i=0;i<l;i++)
sum+=y[i].a;
while(sum<m){
sum-=s[k-1].a;
k--;
// printf("k=%d\n",k);
sum+=y[l].a;
l++;
}
print(k,l);
}
return ;
}
int main() {
//freopen("G:\\Code\\1.txt","r",stdin);
while(scanf("%d%lld",&n,&m)!=EOF){
init();
solve();
}
return 0;
}
<img src="https://img-blog.youkuaiyun.com/20150330122805988?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVElNRUxJTUlURQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
2014-2015 ACM-ICPC, NEERC, Southern Subregional Contest D - Data Center 模拟
最新推荐文章于 2025-02-02 22:07:06 发布