码迷,mamicode.com
首页 > 其他好文 > 详细

Educational Codeforces Round 3

时间:2016-01-04 01:21:53      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

---恢复内容开始---

 

A. USB Flash Drives

水题,排序即可

int a[1111];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    int ans=0; sort(a,a+n);
    for(int i=n-1;m>0;i--) 
        ans++,m-=a[i];
    cout<<ans<<endl;
}

B. The Best Gift

本来以为要缩点,结果m<10,具体看代码

int x,n,m,b[11];
ll sum;
int main()
{
    memset(b,0,sizeof(b)); sum=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&x),b[x]++,sum++;
    ll ans=0;
    for(int i=1;i<=m;i++) {
        sum-=b[i];
        ans+=sum*b[i];
    }
    cout<<ans<<endl;
}

C. Load Balancing

依旧是水题。。

typedef long long ll;
int a[111111];
int main()
{
    ll ans=0,sum=0;
    int n; scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&a[i]),sum+=a[i];
    sort(a,a+n);
    ll sa=sum/n+1,sb=sum/n;
    int na=sum%n,nb=n-sum%n;
    //cout<<na<<nb<<sa<<sb<<endl;
    for(int i=0;i<n;i++) {
        if(nb&&a[i]<=sb) 
            nb--,ans+=sb-a[i];
        else if(na&&a[i]<=sa)
            na--,ans+=sa-a[i];
    }    
    cout<<ans<<endl;
}

D. Gadgets for dollars and pounds

题目读起来很麻烦,而且刚开始还理解错题意了。。以为每件物品既可以用英镑支付又可以用美金支付,

写完才发现样例过不了。

题目一看就是二分,第一反应以为要使用RMQ,后来发现不用也行。

首先把用美金和英镑的分开并排序,然后对于天数二分,在天数区间内遍历

得到最低美金兑换的日子,和英镑的日子,然后比较后选择话费最少burles的gadget购买


typedef long long ll;
typedef pair<int,int> pii ;

#define N 200089
#define M 400009
#define f0(i,n) for(int i=0;i<(n);i++)
#define ff(i,n) for(int i=1;i<=(n);i++)
#define p_b push_back
#define m_p make_pair
#define Abs(a) (a)<0?-(a):(a)
#define Clr(a) memset(a,0,sizeof(a))
#define MID(a,b) (a+((b-a)>>1)) 
#define Lbit(a) (x)&(-(x))
#define X first
#define Y second
const ll INF=1LL<<60-1;  
const int lim=1<<25+1; 

int n,m,k,s;
int a[N],b[N];
vector<pii> d,p;
vector<pii> ans,tans;

int judge(int day) {
    tans.clear();
    int d0=1,d1=1;    
    for(int i=1;i<=day;i++)     {
        if(a[i]<a[d0]) d0=i;
        if(b[i]<b[d1]) d1=i;
    }
    int cnt=k,pd=0,pp=0;
    ll sb=s;
    while(cnt) {
        ll vd=INF,vp=INF;
        if(pd<d.size()) 
            vd=1LL*a[d0]*d[pd].X;
        if(pp<p.size())
            vp=1LL*b[d1]*p[pp].X;
            
        if(vd<vp) {
            //ans[d[pd].Y]=d0;
            tans.p_b(m_p(d[pd].Y,d0));
            cnt--; sb-=vd; pd++;
        }
        else {
            //ans[p[pp].Y]=d1;
            tans.p_b(m_p(p[pp].Y,d1));
            cnt--; sb-=vp; pp++;
        }
    }
//    cout<<day<<" "<<sb<<" "<<cnt<<endl;
    if(sb>=0) {
        ans=tans;  return 1;
    }
    return 0;
}
bool cmp(pii c1,pii c2) {  return c1.X<c2.X; }

int main()
{
    
    int x,y,z;
    cin>>n>>m>>k>>s; 
    d.clear();  p.clear();
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) scanf("%d",&b[i]);
    for(int i=1;i<=m;i++) {
        scanf("%d%d",&x,&y);
        if(x==1) d.p_b(m_p(y,i));
        else p.p_b(m_p(y,i));
    }
    sort(d.begin(),d.end(),cmp);
    sort(p.begin(),p.end(),cmp);        
    int l=1,r=n,mid,res,flag=0;
    while(l<=r) {
        mid=(l+r)>>1;
        if(judge(mid)) {
            flag=1; res=mid; r=mid-1;
        }
        else l=mid+1;
        //cout<<l<<" "<<r<<endl;
    }
    if(flag) {
        printf("%d\n",res);
        for(int i=0;i<ans.size();i++)
            printf("%d %d\n",ans[i].X,ans[i].Y);
    }
    else puts("-1");
    return 0;
}

 

 

---恢复内容结束---

Educational Codeforces Round 3

标签:

原文地址:http://www.cnblogs.com/Eulring/p/5097519.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!