Codeforces Round #325 (Div. 2)

水 A - Alena's Schedule

/************************************************
* Author        :Running_Time
* Created Time  :2015/10/12 星期一 16:49:42
* File Name     :A.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e2 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-8;
int a[N];

int main(void)    {
    int n;	scanf ("%d", &n);
	for (int i=1; i<=n; ++i)	{
		scanf ("%d", &a[i]);
	}
	int ans = 0, i = 1;
	bool fir = true;
	while (i <= n)	{
		if (a[i] == 0)	{
			if (fir)	{
				i++;	continue;
			}
			else	{
				int j = i + 1;
				while (j <= n)	{
					if (a[j] == 0)	{
						j++;
					}
					else	break;
				}
				if (j == n + 1)	break;
				if (j - i >= 2)	{
                    i = j;	continue;
				}
				else	{
					ans += j - i;
					i = j;
				}
			}
		}
		else	{		//a[i] = 1;
			fir = false;
            ans++;	i++;
		}
	}
	printf ("%d
", ans);

    return 0;
}

  

水 B - Laurenty and Shop

/************************************************
* Author        :Running_Time
* Created Time  :2015/10/12 星期一 16:49:42
* File Name     :B.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 55;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-8;
int a1[N], a2[N], b[N];
int sum1[N], sum2[N];
bool vis[N];

int main(void)    {
	int n;	scanf ("%d", &n);
	for (int i=1; i<n; ++i)	{
		scanf ("%d", &a1[i]);
	}
	for (int i=1; i<n; ++i)	{
		scanf ("%d", &a2[i]);
	}
	for (int i=1; i<=n; ++i)	{
		scanf ("%d", &b[i]);
	}

	if (n == 2)	{
		printf ("%d
", a1[1] + a2[1] + b[1] + b[2]);
		return 0;
	}

	for (int i=1; i<n; ++i)	{
		sum1[i] = sum1[i-1] + a1[i];
	}
	for (int i=n-1; i>=1; --i)	{
		sum2[i] = sum2[i+1] + a2[i];
	}
	int mn = INF, id = 0;
	int ans = 0;
	for (int i=0; i<n; ++i)	{
        if (sum1[i] + b[i+1] + sum2[i+1] < mn)	{
			mn = sum1[i] + b[i+1] + sum2[i+1];
			id = i;
        }
	}
	vis[id] = true;	ans += mn;
	mn = INF, id = 0;
	for (int i=0; i<n; ++i)	{
		if (sum1[i] + b[i+1] + sum2[i+1] < mn && !vis[i])	{
			mn = sum1[i] + b[i+1] + sum2[i+1];
			id = i;
		}
	}
	ans += mn;
	printf ("%d
", ans);

    return 0;
}

  

暴力+队列 C - Gennady the Dentist

题意:小孩子排队看医生,有一定的连锁反应,问医生最后能治好多少人

分析:开始想用D保存d[]的和,无奈被hack掉了,还是老老实实用队列吧

/************************************************
* Author        :Running_Time
* Created Time  :2015/10/12 星期一 16:49:42
* File Name     :C.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 4e3 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-8;
int v[N], d[N], p[N];
bool dead[N];

int main(void)    {
	int n;	scanf ("%d", &n);
	for (int i=1; i<=n; ++i)	{
		scanf ("%d%d%d", &v[i], &d[i], &p[i]);
		dead[i] = false;
	}
	vector<int> ans;
	queue<int> Q;
	for (int i=1; i<=n; ++i)	{
		if (!dead[i])	{
			ans.push_back (i);
			for (int j=i+1; j<=n; ++j)	{
				if (dead[j])	continue;
				p[j] -= v[i];	v[i]--;
				if (p[j] < 0)	{
					dead[j] = true;
					Q.push (j);
				}
				if (v[i] <= 0)	break;
			}
		}
		while (!Q.empty ())	{
			int x = Q.front ();	Q.pop ();
			for (int j=x+1; j<=n; ++j)	{
				if (dead[j])	continue;
				p[j] -= d[x];
				if (p[j] < 0)	{
					dead[j] = true;
					Q.push (j);
				}
			}
		}
	}

	printf ("%d
", ans.size ());
	for (int i=0; i<ans.size (); ++i)	{
		printf ("%d%c", ans[i], i == ans.size () - 1 ? '
' : ' ');
	}

    return 0;
}

  

BFS D - Phillip and Trains

题意:一个人从左边走到右边,同时有列车从右边开过来,问这个人能否达到右边没有碰到列车

分析:简答的BFS,车看作不动,人相对车有一个相对运动,还是要用vis标记已访问过的点,比赛时这点忘了,MLE了

/************************************************
* Author        :Running_Time
* Created Time  :2015/10/12 星期一 16:49:42
* File Name     :D.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e2 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-8;
char maze[4][N];
bool vis[4][N];
int dx[3] = {-1, 0, 1};
int n, k;

bool BFS(int sx, int sy)	{
	queue<pair<int, int> > Q;	Q.push (make_pair (sx, sy));
	memset (vis, false, sizeof (vis));  vis[sx][sy] = true;
    while (!Q.empty ())	{
		int x = Q.front ().first, y = Q.front ().second;	Q.pop ();
        if (y >= n)	return true;
        if (y + 1 <= n && maze[x][y+1] != '.')	continue;
        for (int i=0; i<3; ++i)	{
			int tx = x + dx[i], ty = y + 1;
			if (tx < 1 || tx > 3 || maze[tx][ty] != '.')	continue;
            ty += 1;
            if (ty <= n && maze[tx][ty] != '.')	continue;
            ty += 1;
            if (ty <= n && maze[tx][ty] != '.')	continue;
            if (vis[tx][ty])    continue;
            vis[tx][ty] = true;
            Q.push (make_pair (tx, ty));
        }
	}
	return false;
}

int main(void)    {
	int T;	scanf ("%d", &T);
	while (T--)	{
		scanf ("%d%d", &n, &k);
		for (int i=1; i<=3; ++i)	{
			scanf ("%s", maze[i] + 1);
		}
		int sx = 0, sy = 0;
		for (int i=1; i<=3; ++i)	{
            if (maze[i][1] == 's')	{
				sx = i;	sy = 1;
				break;
            }
		}
        for (int i=n+1; i<=n+6; ++i)    {
            maze[1][i] = maze[2][i] = maze[3][i] = '.';
        }
		printf ("%s
", BFS (sx, sy) ? "YES" : "NO");
	}

    return 0;
}

  

编译人生,运行世界!
原文地址:https://www.cnblogs.com/Running-Time/p/4875001.html