码迷,mamicode.com
首页 > 其他好文 > 详细

#个人赛第七场解题总结# (FZU 1881三角形问题 找规律 &&FZU 1884 排火车 模拟)

时间:2015-04-01 20:01:36      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:比赛总结

链接:click here~~ ,密码:nyist

C - 三角形问题

Description

给你一个由无穷个节点组成的三角形(如下图),你的任务很简单——任意给你两个正整数x和y,判断它们是否相邻(重合不是相邻)。
技术分享

Input

第一行T,表示T组测试数据,接下来仅有两个32位正整数x 和y。

Output

对于每组测试数据,首先输出”Case k:”,其中k表示第几组。然后如果x和y相邻,则输出“Yes”,否则输出“No”。

Sample Input

31 11 21 11

Sample Output

Case 1:NoCase 2:YesCase 3:No
【解题思路】:

模拟判断一下,具体看代码吧,脑子有点累了,,手也有点懒了,懒的写写太多没用的东西。。

代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
__int64  a[100005];
int main()
{
    __int64 n,m,i,j;
    int t,tot=1;
    a[0]=1;
    for(i=1; i<100000; i++)
    {
        a[i]=i+a[i-1];
    }
    scanf("%d",&t);
    while(t--)
    {
        scanf("%I64d%I64d",&n,&m);
                if(n>m){swap(n,m);}
                printf("Case %d:",tot++);
        if(n==m)
        {
           printf("No\n");
            continue;
        }
        for(i=0; i<100000; i++)
        {
            if(n<a[i])
            {
                   break;
            }
        }
        if(n==a[i]-1)
        {
            if(m==n+i||m==n+i+1)
            {
                printf("Yes\n");
            }
            else printf("No\n");
        }
        else
        {
            if(n==m-1||n+1+i==m||n+i==m)
            {
                printf("Yes\n");
            }
            else printf("No\n");
        }
    }
    return 0;
}
D - 排火车

Description

某天,Apple问起Gaga,”扑克牌排火车有没有玩过??”,”没有-_-“。Apple感到很不可思议,他决定马上教Gaga玩这个游戏。碍于手头上没有扑克牌,Apple就剪了几张卡片,然后在卡片上写上数字,然后对Gaga说“简单来讲,就是你有一堆牌,我有一堆牌,我们轮流出,每次把牌叠在上一次出的牌的下方,如果这时发现当前的牌与前面的牌有重复,那么这之间的牌就都归你了。这样到最后谁没有牌,谁就输了。”“oh,原来如此”。Gaga觉得这个也不过如此。

于是他们开始玩排火车了。。。

现在假设Apple和Gaga各有N张牌,Apple先出牌。请你给出一轮下来Apple和Gaga各获得的牌数。

Input

第一行T,表示T组测试数据,接下来有T部分。

每部分开头是一个整数N(1 <= N <= 50000),表示Apple和Gaga的牌数。接下来有2行,给出Apple和Gaga的牌的情况。首先给出Apple的牌,有N个整数,第i个整数xi(1 <= xi <= 100000)表示Apple的第i张牌面。其次给出Gaga的牌,格式类似。

Output

对于每组测试数据,首先输出”Case k:”,其中k表示第几组。然后输出 Apple和Gaga这一轮获得的牌数。

Sample Input

331 2 31 2 341 4 6 82 5 9 1035 5 56 6 6

Sample Output

Case 1:Apple:0 Gaga:6Case 2:Apple:0 Gaga:0Case 3:Apple:3 Gaga:3

Hint

输入巨大,c++请使用scanf输入避免超时。
【解题思路】:此题真是有点险啊,最后一分种交上了,其实题目理解不难,就是我们小时候常常玩的堆火车,情景在线啊,现在想想蛮怀恋的~~
赛后看了题解报告,是用栈模拟过的,自己用的模拟,大致是发现如果前后出现相同的元素,立刻标记,然后统计数的个数,依次循环到最后。
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stack>
#include <algorithm>
using namespace std;
const int N=100005;
const double pi=acos(-1.0);
#define  LL  __int64
int a[N],b[N],c[N];
int  flag[N];
int main()
{
    int t,i,j,n,m,tot=1;
    scanf("%d",&t);
    while(t--)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(flag,0,sizeof(flag));
        scanf("%d",&n);
        for(i=1; i<=n; i++)  scanf("%d",&a[i]);
        for(i=1; i<=n; i++) scanf("%d",&b[i]);
        int s1=0,s2=0,ss=1;
        for(int i=1; i<=n; i++){
            if(flag[a[i]]!=0){
                s1++;
                int temp=flag[a[i]];
                for(int k=flag[a[i]]; k<ss; k++){
                    flag[c[k]]=0;
                    s1++;
                }
                ss=temp;
            }
            else{
                flag[a[i]]=ss;
                c[ss++]=a[i];
            }
            if(flag[b[i]]!=0){
                s2++;
                int temp=flag[b[i]];
                for(int k=flag[b[i]]; k<ss; k++){
                    flag[c[k]]=0;
                    s2++;
                }

                ss=temp;
            }
            else{
                flag[b[i]]=ss;
                c[ss++]=b[i];
            }
        }
        printf("Case %d:Apple:%d Gaga:%d\n",tot++,s1,s2);
    }
    return 0;
}

#个人赛第七场解题总结# (FZU 1881三角形问题 找规律 &&FZU 1884 排火车 模拟)

标签:比赛总结

原文地址:http://blog.csdn.net/u013050857/article/details/44810847

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!