1001:STL
1002:DP
1003:DP
1004:Unfinished
像我这种几乎没打过什么线上比赛的蒟蒻已经很少了吧。上午的时候发现晚上有一场BC,于是毫不犹豫地报(爆)名(零)了。
1001 Skip the Class
用map,string,sort什么的xjb搞一下就行了。(上机太迟,交得比较晚)
#include<cstdio>
#include<string>
#include<algorithm>
#include<map>
#include<iostream>
#define N 105
using namespace std;
struct Pair
{
string s; int v;
bool operator < (Pair that) const
{
return v > that.v;
}
}p[N];
namespace runzhe2000
{
void main()
{
int T; scanf("%d",&T);
for(; T--; )
{
int n; scanf("%d",&n);
for(int i = 1; i <= n; i++)
cin >> p[i].s >> p[i].v;
sort(p+1, p+1+n);
map<string, int> vis;
int ans = 0;
for(int i = 1; i <= n; i++)
{
if(vis[p[i].s] < 2)
{
vis[p[i].s]++;
ans += p[i].v;
}
}
printf("%d\n",ans);
}
}
}
int main()
{
runzhe2000::main();
}
1002 Count the Sheep
记f[i][0/1/2/3]表示从i开始继续走0/1/2/3次的方案数,从二分图的另一个点集里所有可以到达的点转移过来,再减去那个点走向自己的方案数即可。
然后就FST了,原因是TLE。。。QAQ我就当攒人品吧。
辣鸡BC,卡我常数,使我爆零,掉我排名,毁我青春。
以下为优化过后的可通过代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100005
#define ll long long
using namespace std;
namespace runzhe2000
{
ll f[N][4], ans;
int n, m, k, a[N], b[N];
int read()
{
int r = 0; char c = getchar();
for(; c < '0' || c > '9'; c = getchar());
for(; c >='0' && c <='9'; r = r*10+c-'0', c = getchar());
return r;
}
void dp()
{
memset(f, 0, sizeof f);
for(int i = 1; i <= m; i++) f[i][0] = 1;
for(int i = 1; i <= k; i++)
f[a[i]][1] += f[b[i]][0];
for(int i = 1; i <= k; i++)
f[b[i]][2] += f[a[i]][1] - f[b[i]][0];
for(int i = 1; i <= k; i++)
f[a[i]][3] += f[b[i]][2] - f[a[i]][1] + 1;
for(int i = 1; i <= n; i++)
ans += f[i][3];
}
void main()
{
int T; scanf("%d",&T);
for(; T--; )
{
n = read(), m = read(), k = read(), ans = 0;
for(int i = 1; i <= k; i++) a[i] = read(), b[i] = read();
dp();
printf("%lld\n",ans<<1);
}
}
}
int main()
{
runzhe2000::main();
}
1003 Girls Love 233
考场上想了一个DP,脑补了一下好像没什么问题。没rush出来。有空再搞搞看。
UPD(2017/02/25 23:58):好吧写完了。我好弱啊,考场上这种这么短的题都没写出来。自己每次到考场上都会紧张,各种傻眼,各种丢东西。自己做题的时候各种顺,在考场上就各种坑细节,果然没救。
一个233是否存在显然只跟前后两个2的位置有关,记f[i][j][k]表示第i个2放在j位置,此时还剩k次移动机会,最大的233个数。
#include<cstdio>
#include<algorithm>
#define N 105
using namespace std;
namespace runzhe2000
{
const int INF = 1<<30;
char s[N];
int f[N][N][N<<1], pos[N], n, m, cnt, ans;
int abs(int x){return x<0?-x:x;}
void main()
{
int T; scanf("%d",&T);
for(; T--; )
{
scanf("%d%d%s",&n,&m,s+1);
m >>= 1; cnt = 0; s[++n] = '2';
for(int i = 1; i <= n; i++)
if(s[i] == '2') pos[++cnt] = i;
for(int i = 0; i <= cnt; i++)
for(int j = 0; j <= n; j++)
for(int k = 0; k <= m; k++)
f[i][j][k] = -INF;
f[0][0][m] = ans = 0;
for(int i = 1; i <= cnt; i++)
{
for(int j = i; j <= n; j++)
{
int w = abs(pos[i] - j);
for(int k = 0, kk = m - w; k <= kk; k++)
{
for(int l = j-1; l >= 0; l--)
{
f[i][j][k] = max(f[i][j][k], f[i-1][l][k+w] + (j-l>2 && i-1?1:0));
}
}
}
}
for(int j = 1; j <= n; j++)
for(int k = 0; k <= m; k++)
ans = max(ans, f[cnt][j][k]);
printf("%d\n",ans);
}
}
}
int main()
{
runzhe2000::main();
}
1004 Game Arrangement
以后再填。