Codeforces Round #328 (Div. 2)

A. PawnChess

很简单的暴力。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<list>
#include<deque>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cctype>
#include<sstream>
using namespace std;
#define pii pair<int,int>
#define LL long long int
const double eps=1e-10;
const int INF=1000000000;
const int maxn=1000000+10;

char mp[10][10];

int main()
{
    //freopen("in2.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    for(int i=0;i<8;i++)
    {
        scanf("%s",mp[i]);
    }
    int sa=INF,sb=INF;
    for(int i=0;i<8;i++)
    {
        for(int j=0;j<8;j++)
        {
            if(mp[i][j]==‘W‘)
            {
                int st=0;
                bool can=1;
                for(int k=i-1;k>=0;k--)
                {
                    if(mp[k][j]==‘.‘)
                    {
                        st++;
                    }
                    else
                    {
                        can=0;
                        break;
                    }
                }
                if(can==1)
                {
                    sa=min(sa,st);
                }
            }
            else if(mp[i][j]==‘B‘)
            {
                int st=0;
                bool can=1;
                for(int k=i+1;k<8;k++)
                {
                    if(mp[k][j]==‘.‘)
                    {
                        st++;
                    }
                    else
                    {
                        can=0;break;
                    }
                }
                if(can==1)
                {
                    sb=min(sb,st);
                }
            }
        }
    }
    if(sa>sb) cout<<‘B‘<<endl;
    else cout<<‘A‘<<endl;
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

B. The Monster and the Squirrel

就是个找规律而已,输入n,输出(n-2)*(n-2)。注意要用long long。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<list>
#include<deque>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cctype>
#include<sstream>
using namespace std;
#define pii pair<int,int>
#define LL long long int
const double eps=1e-10;
const int INF=1000000000;
const int maxn=1000000+10;

int main()
{
    //freopen("in2.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    LL n;
    cin>>n;
    cout<<(n-2)*(n-2)<<endl;
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

C. The Big Race

题目描述太烂,读了半天都不懂。。不做了。。

D. Super M(虚树,找直径)

1.第一次肯定要落在被攻击的点上。因为如果落在无关点上,那么肯定要先从无关点上走到一个攻击点上,那么这段路没有意义啊,完全可以直接落在那个攻击点上。

2.无关的点能不走就不走,所以最后走过的肯定就是一棵包含所有攻击点的最小子树。

3.从一个攻击点出发,最后再回来。总路程是子树的边长之和的2倍。但是实际上到了最后一个攻击点后就没有必要再走回来了,所以最后总路程是sum-mx,但是要使总路程最短,就要让mx(也就是终点到起点的路径长)最长,那么显然是这个虚树的直径最长。

所以本题就是,找出这个虚树,再求出虚树直径。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<list>
#include<deque>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cctype>
#include<sstream>
using namespace std;
#define pii pair<int,int>
#define LL long long int
const double eps=1e-10;
const int INF=1000000000;
const int maxn=1000000+10;
const int MAX = 130000;
vector<int> adj[MAX];
int d[MAX], size[MAX];
bool mark[MAX];
void dfs(int p, int v)
{
    size[v] = 0;
    if (mark[v])
        size[v] = 1;
    for (int i = 0; i < adj[v].size(); i++)
    {
        int u = adj[v][i];
        if (u != p)
        {
            d[u] = d[v] + 1;
            dfs(v, u);
            size[v] += size[u];//size是子树里有多少mark节点(包括自己)
        }
    }
}
int main()
{
    //freopen("in2.txt","r",stdin);
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n - 1; i++)
    {
        int u, v;
        cin >> u >> v;
        u--;
        v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for (int i = 0; i < m; i++)
    {
        int v;
        cin >> v;
        v--;
        mark[v] = true;
    }
    dfs(-1, 0);
    int v = -1;
    for (int i = 0; i < n; i++)
        if (mark[i] && (v == -1 || d[v] < d[i]))
            v = i;
    memset(d, 0, sizeof(d));
    dfs(-1, v);
    int sum = 0;
    int mx = 0;
    for (int i = 0; i < n; i++)
    {
        if (size[i] > 0 && m - size[i] > 0)//m==size[i]的那个不用加了,因为边比点少一个。
            sum += 2;
        cout<<i<<‘ ‘<<size[i]<<endl;
        if (mark[i])
            mx = max(mx, d[i]);
    }
    for (int i = 0; i < n; i++)//找出字典序小的那个作为登陆点
        if (mark[i] && i < v && d[i] == mx)
        {
            v = i;
            break;
        }
    cout << v + 1 << "\n" << sum - mx << "\n";
    return 0;
}

时间: 2024-10-12 15:50:35

Codeforces Round #328 (Div. 2)的相关文章

Codeforces Round #328 (Div. 2) B

Description Ari the monster always wakes up very early with the first ray of the sun and the first thing she does is feeding her squirrel. Ari draws a regular convex polygon on the floor and numbers it's vertices 1, 2, ..., n in clockwise order. Then

Codeforces Round #328 (Div. 2) A

Description Galois is one of the strongest chess players of Byteforces. He has even invented a new variant of chess, which he named «PawnChess». This new game is played on a board consisting of 8 rows and 8 columns. At the beginning of every game som

随笔—邀请赛前训—Codeforces Round #328 (Div. 2) A. PawnChess

题意:给你一个8×8的棋盘分布,红黑棋子,双方只能朝上下其中一个方向移动,不可跨越对方或自己的棋子,最先到对面底部的人赢.问谁赢? 思路:上下2排同时开始扫,先扫到谁都棋,谁就赢(前提是没有对方的人挡路..) #include<cstdio> #include<cstring> #include<iostream> using namespace std; #define MAX(x,y) (((x)>(y)) ? (x) : (y)) #define MIN(x

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除