TopCoder SRM 676 Div2

网上TC的题解真的很少很少啊,很多场好像都没有。
这场略难。
T3数据好像有锅。
来不及写题解了,就贴个代码。

T1 FarmvilleDiv2

#include <bits/stdc++.h>
using namespace std;
const int N=51;
int n;
struct data{
    int t,c;
}a[N];

class FarmvilleDiv2 {
public:
    int minTime( vector <int> time, vector <int> cost, int budget );
};

int cmp(const data q,const data w) { return q.c<w.c; }

int FarmvilleDiv2::minTime(vector <int> time, vector <int> cost, int budget) {
    int n=time.size();
    for(int i=0;i<n;i++) a[i].t=time[i],a[i].c=cost[i];
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++){
        int w=min(budget/a[i].c,a[i].t);
        a[i].t-=w;
        budget-=w*a[i].c;
    }
    int ans=0;
    for(int i=0;i<n;i++) ans+=a[i].t;
    return ans;
}

T2 BoardEscapeDiv2

#include <bits/stdc++.h>
using namespace std;
const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};
int n,m;

class BoardEscapeDiv2 {
public:
    string findWinner( vector <string> s, int k );
};

int pd(int x,int y,vector<string> s){
    for(int i=0;i<4;i++){
        int xx=x+dx[i],yy=y+dy[i];
        if (xx>=0&&xx<n&&yy>=0&&yy<m)
         if (s[xx][yy]=='E') return 1;
    }
    return 0;
}

string BoardEscapeDiv2::findWinner(vector <string> s, int k) {
    int x,y;
    n=s.size();m=s[0].size();
    for(int i=0;i<n;i++)
     for(int j=0;j<m;j++)
      if (s[i][j]=='T') x=i,y=j;
    if (s[x][y]=='E') return "Bob";
    int flag=0;
    for(int i=0;i<4;i++){
        int xx=x+dx[i],yy=y+dy[i];
        if (xx>=0&&xx<n&&yy>=0&&yy<m)
         if (s[xx][yy]=='E') return "Alice";
          else
             if (s[xx][yy]!='#'){
                //flag=1;
                if (!pd(xx,yy,s)||k==1) flag=1;
                cout<<flag<<endl;
             }
    }
    if (!flag) return "Bob";

    if (k&1) return "Alice";
      else return "Bob";
}

T3 RailroadSwitchOperator

#include <bits/stdc++.h>
using namespace std;
const int MAXN=150001;
int a[MAXN];
bool b[MAXN];
int m;
struct data{
    int L,r;
}c[MAXN];

class RailroadSwitchOperator {
public:
    int minEnergy( int N, vector <int> x, vector <int> t );
};

int cmp(const data &q,const data &w){
    return q.r<w.r;
}

int RailroadSwitchOperator::minEnergy(int N, vector <int> x, vector <int> t) {
    int n=x.size();
    memset(b,0,sizeof b);
    m=0;
    for(int i=0;i<n;i++){
        int xx=x[i],v=N>>1,rt=1;
        for(int j=0;v;j++){
            if ((xx>v)==b[rt]) a[rt]=t[i]+j;
             else{
                b[rt]=(xx>v);
                c[++m].L=a[rt]+1;
                a[rt]=t[i]+j;
                c[m].r=t[i]+j;
             }
            rt<<=1;
            if (xx>v) xx-=v,rt++;
            v>>=1;
        }
    }
    for(int i=1;i<=m;i++) cout<<c[i].L<<' '<<c[i].r<<endl;
    sort(c+1,c+m+1,cmp);
    int w=-1,ans=0;
    for(int i=1;i<=m;i++)
     if (c[i].L>w){
        w=c[i].r;
        ans++;
     }
    return ans;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值