Sicily1020,1021,1156

1020 Big Integer

http://soj.sysu.edu.cn/1020
题目:给定大整数x(400个字符以内),求x对b1,b2,..,bn的模。
思路:12345678901234567890 % m
= ( ( 1 % m * 10 + 2 ) % m*10+3 ) % m …
代码:

int div(char x[], int b) {
    int r = 0;
    for (int i=0; x[i]!='\0'; i++) {
        r = (r*10 + x[i]-'0') % b;
    }
    return r;
}


int main()
{
    // 1020 Big Integer
    int t, n, i;
    scanf("%d",&t);

    while (t--) {
        scanf("%d",&n);

        int b[maxn];
        for (i=0; i<n; i++)
            scanf("%d",&b[i]);

        char x[maxm];
        scanf("%s",x);

        int len = strlen(x);
        printf("(%d",div(x,b[0]));
        for (i=1; i<n; i++)
            printf(",%d",div(x, b[i]));
        printf(")\n");
    }

    return 0;
}

1021 Couple

http://soj.sysu.edu.cn/1021
题目:1~N排成一列,若相邻两个为夫妻,则可消去,判断最终能否全部消去。
思路:将每对夫妻视作不同的括号,利用stack进行括号匹配。
代码:


    // 1021 Couple  
    int n;
    while (scanf("%d",&n)==1 && n>0)
    {
        int couple[maxn];
        int a, b;
        for (int i=0; i<n; i++) {
            scanf("%d%d",&a, &b);
            couple[a] = b;
            couple[b] = a;
        }   

        int i=1;
        stack<int> s;
        for (i=1; i<=2*n; i++) {
            if (!s.empty() && s.top()==couple[i])
                s.pop();
            else 
                s.push(i);
        }   

        if(s.empty()) 
            printf("Yes\n");
        else
            printf("No\n");
    }

1156 Binary Tree

http://soj.sysu.edu.cn/1156
题目:输入每个节点的id、内容、左右子树的id,输出这棵树的前序遍历。
思路:dfs
代码:

// 先序遍历
void dfs(int root, int left[], int right[], char c[])
{
    printf("%c",c[root]);
    if (left[root]!=0)
        dfs(left[root], left, right, c);
    if (right[root]!=0)
        dfs(right[root], left, right, c);
    return;
}


int main()
{
    int n, root;
    bool id[maxn];
    int p[maxn], left[maxn], right[maxn];
    char content[maxn];

    while(scanf("%d",&n)!=EOF)
    {       
        // 初始化:没有一个id出现过,所有id的parent为-1
        for (int i=1; i<maxn; i++){
            id[i] = false;
            p[i] = -1;
        }
        // 输入id为val,内容为content[val],左右孩子为left[val]和right[val]
        // 记左右孩子的parent为val
        int val;
        for (int i=0; i<n; i++) {
            scanf("%d",&val);
            id[val] = true;
            //scanf("%s",&content[val]);
            content[val] = getchar();
            content[val] = getchar();
            scanf("%d%d",&left[val],&right[val]);
            p[left[val]] = p[right[val]] = val;
        }
        // 寻找根节点的id
        root = 0;
        for (int i=1; i<maxn; i++) 
            if (id[i] && p[i]==-1) {
                root = i;
                break;
            }
        // 从根节点开始dfs
        dfs(root, left, right, content);
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值