话说个人感觉这次的分数分布比较特别……之前没见过,表示孤陋寡闻了……orz……
Div2.
256pt:水题,找出最小的数和第二小的数,如果最小的数和第二小的数相等,则为最小数乘以二,否则为最小数乘以二加一,表示用vector+sort代码更短
int Max(int x,int y,int z)
{
if (x>=y && x>=z) return x;
if (y>=x && y>=z) return y;
return z;
}
int Min(int x,int y,int z)
{
if (x<=y && x<=z) return x;
if (y<=x && y<=z) return y;
return z;
}
class MarbleDecoration
{
public:
int maxLength(int R, int G, int B)
{
int i,j,n,m;
n=Max(R,G,B);
m=Min(R,G,B);
m=R+G+B-m-n;
// printf("%d..%d\n",n,m);
if (m==n) return m+n;
else return 2*m+1;
}
};
512pt:写挫了……分一半都不到,只需要枚举答案判断从第一天到该天手上的钱是否足够买即可。
int dp[80][80];
int Change(char ch)
{
if (ch>='0' && ch<='9') return ch-'0';
if (ch>='a' && ch<='z') return ch-'a'+36;
return ch-'A'+10;
}
bool Check(int t,int val,int m)
{
int min,i,p,x,j;
x=0;
for (i=0;i<7;i++)
{
p=t/7*7+i;
if (p>t) p-=7;
// printf("%d~~~\n",p);
if (p<0) break;
min=999999999;
for (j=0;j<m;j++)
{
if (dp[p][j]<min) min=dp[p][j];
}
x+=min;
// printf("%d...\n",min);
}
// printf("%d..%d\n",x,t);
if (x<=val) return true;
return false;
}
class MysteriousRestaurant
{
public:
int maxDays(vector<string> prices, int budget)
{
int i,j,n,m;
n=prices.size();
m=prices[0].size();
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if (i<7) dp[i][j]=Change(prices[i][j]);
else dp[i][j]=dp[i-7][j]+Change(prices[i][j]);
}
}
for (i=n-1;i>=0;i--)
{
if (Check(i,budget,m)==true) return i+1;
}
return 0;
}
};
1024pt:裸最优匹配,不解释,套模板表示没注意模板中开的数组太小- -|||悲剧。……
int Map[55][55];
int Check(char x,char y)
{
if (x==y) return 0;
if (x=='S' && y=='R' || x=='R' && y=='P' || x=='P' && y=='S') return -1;
return 1;
}
int Count(string x,string y)
{
if (Check(x[1],y[1])==1 && Check(x[0],y[0])==1) return 2;
if (Check(x[1],y[1])==1 && Check(x[0],y[0])==0) return 1;
return 0;
}
const int inf = 0x7fffffff;
int n,m,lx[55],ly[55],match[55];
bool x[55],y[55];
bool SearchPath(int u)
{
int v;
x[u] = true;
for (v = 1; v <= n; v++)
if(!y[v] && ly[v] + lx[u] == Map[u][v])
{
y[v] = true;
if (match[v] == -1 || SearchPath(match[v]))
{
match[v] = u;
return true;
}
}
return false;
}
int KM()
{
int i,j,k,d;
for (i = 1; i <= n; i++)
while(1)
{
memset(x,false,sizeof(x));
memset(y,false,sizeof(y));
if (SearchPath(i))
break;
d = inf;
for (j = 1; j <= n; j++)
if (x[j])
{
for (k = 1; k <= n; k++)
if (!y[k])
if (d > lx[j] + ly[k] - Map[j][k])
d = lx[j] + ly[k] - Map[j][k];
}
for (j = 1; j <= n;j ++)
{
if (x[j]) lx[j] -= d;
if (y[j]) ly[j] += d;
}
}
int ans = 0;
for (i = 1; i <= n; i++)
ans += Map[match[i]][i];
return ans;
}
class DoubleRoshambo
{
public:
int maxScore(vector<string> A, vector<string> E)
{
int i,j;
n=A.size();
m=n;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
Map[i+1][j+1]=max(Count(A[i],E[j]),0);
// printf("%d ",Map[i+1][j+1]);
}
// printf("\n");
}
memset(ly,0,sizeof(ly));
for (i = 1; i <= n; i++)
{
lx[i] = -inf;
for (j = 1; j <= n; j++)
{
if (lx[i] < Map[i][j])
{
lx[i] = Map[i][j];
}
}
}
memset(match,-1,sizeof(match));
return KM();
}
};