网上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;
}