设为首页 加入收藏

TOP

Codeforces Round #288 (Div. 2) A,B,C,D,E
2015-07-20 17:22:44 来源: 作者: 【 】 浏览:1
Tags:Codeforces Round #288 Div.

A:一个一个点向图里面加,判断其所在的位置与其他的点是否可以构成小矩形就可以了。

B:贪心,如果前面的偶数有比他小的就找到一个最靠前的交换,如果前面的偶数都比它小,就找一个最靠后的交换。

C:贪心,把蜡烛尽可能的放在恶魔,来之前,这样可以充分利用蜡烛的时间,模拟一下,不停地向前方就可以了。如果蜡烛时间小于需要的数目,一定不可以。

const int maxn = 2010;


int vis[maxn];
int num[maxn];

int main()
{
    int m, t, r;
    while(cin >>m>>t>>r)
    {
        for(int i = 1; i <= m; i++)
            scanf("%d",&num[i]);
        if(r > t)
        {
            puts("-1");
            continue;
        }
        int ans = 0;
        memset(vis, 0, sizeof(vis));
        for(int i = 1; i <= m; i++)
        {
            int x = num[i]-1;
            while(vis[num[i]+1000] < r)
            {
                for(int k = x-1; k <= x+t; k++)
                    vis[k+1000]++;
                ans++;
                x --;
            }
        }
        cout<
  
   
D:欧拉路径+打印路径。

判断欧拉路径的方法是,统计出来他的度(入度+, 出度-)。如果所有的度均为0,或者只有一对度数为(+1,-1)的,那么就可以构成路径。但是这题还必须保证字符串的数目,所以判断之后,还有跑一遍dfs求出长度,判断长度是否满足条件。

打印路径的时候,先dfs再保存边,这样可以保证一开始存的边一定是距离“起点”最远的。

const int maxn = 200010;
char str[maxn][10];

int deg[maxn];
int ans[maxn];
int vis[maxn];
int cur[maxn];

vector
    
      > G[maxn*3];

int cnt;

int Get(char x)
{
    if ('0' <= x && x <= '9')return x-'0';
    if ('a' <= x && x <= 'z')return x-'a'+10;
    return x-'A'+36;
}

int get_x(int x)
{
    return Get(str[x][0])*62+Get(str[x][1]);
}

int get_y(int y)
{
    return Get(str[y][1])*62+Get(str[y][2]);
}

void dfs(int x, int y)
{
    int xp;
    int n = G[x].size();
    while(cur[x] < n)
    {
        if(!vis[G[x][xp = cur[x]++].second])
        {
            vis[G[x][xp].second] = 1;
            dfs(G[x][xp].first, G[x][xp].second);
        }
    }
    ans[cnt++] = y;
}


bool judge(int n)
{
    int x = 0;
    int y = 0;
    int pos = get_x(0);
    for(int i = 0; i < 62*62+100; i++)
    {
        if(deg[i] > 1 || deg[i] < -1) return false;
        if(deg[i] == 1)
        {
            x++;
            pos = i;
        }
        if(deg[i] == -1) y++;
    }
    if(x != y || x > 1) return false;
    dfs(pos, -1);
    cnt--;
    return cnt >= n;
}

int main()
{
    int n;
    while(cin >>n)
    {
        memset(cur, 0, sizeof(cur));
        memset(vis, 0, sizeof(vis));
        memset(deg, 0, sizeof(deg));
        cnt = 0;
        for(int i = 0; i < n; i++)
        {
            scanf("%s", str[i]);
            int x = get_x(i);
            int y = get_y(i);
            G[x].push_back(make_pair(y, i));
            deg[x]++;
            deg[y]--;
        }
        if(!judge(n))
        {
            cout<<"NO"<
     
      = 0; i--) printf("%s", str[ans[i]]+2); puts(""); } return 0; } /* 6 abc bca cab cad adc dca */
     
    


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 3861 Prison Breake 状态压缩.. 下一篇poj-3286 Silver Cow Party

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python爬虫教程(从 (2025-12-26 16:49:14)
·【全269集】B站最详 (2025-12-26 16:49:11)
·Python爬虫详解:原 (2025-12-26 16:49:09)
·Spring Boot Java: (2025-12-26 16:20:19)
·Spring BootでHello (2025-12-26 16:20:15)