编程之美初赛B

题目3 : 八卦的小冰

时间限制: 2000ms
单点时限: 1000ms
内存限制: 256MB

描述

小冰是个八卦的人,最近她对一个社交网站很感兴趣。

由于小冰是个机器人,所以当然可以很快地弄清楚这个社交网站中用户的信息啦。

她发现这个社交网站中有N个用户,用户和用户之间可以进行互动。小冰根据用户之间互动的次数和内容判断每对用户之间的亲密度。亲密度非负,若大于零表示这两个用户之间是好友关系。由于这个网站是活跃的,所以小冰会不停地更新用户之间的亲密度。

由于隐私保护,小冰无法知道每个用户的确切性别,但是作为一只很聪明的人工智能,小冰可以通过每个用户的行为来猜测性别。当然这种猜测是不准确的,小冰有可能会改变对一个用户的判断。

小冰想知道这个社交网络的八卦度是多少。八卦度的定义是社交网络中所有异性好友之间的亲密度之和。你能帮助她吗?

输入

第一行一个整数T,表示数据组数。接下来是T组数据,每组数据的格式如下:

第一行是三个整数N, M, Q,分别表示用户数、初始的好友对数、操作数。

第二行是N个空格隔开的数,第i个数表示i号用户的性别,用0或1表示。

接下来的M行,每行三个数x, y, z,代表初始状态用户x和用户y之间的亲密度是z。除此之外的用户之间的亲密度初始为0。

接下来是Q行,每行是以下三种操作中的一种:

1. “1 x”:改变用户x的性别

2. “2 x y z”:改变用户x与用户y之间的亲密度为z

3. “3”:询问八卦度

输出

对于每组数据首先输出一行"Case #X:",X为测试数据编号。

接下来对于每一个询问,输出一行包含询问的八卦度。

数据范围

1 ≤ T ≤ 20

1 ≤ x, y ≤ N

0 ≤ z ≤ 100000

小数据

1 ≤ N, M ≤ 100

1 ≤ Q ≤ 1000

大数据

1 ≤ N, M, Q ≤ 100000

样例输入
1
3 2 8
0 1 0
1 2 1
1 3 1
3
1 1
1 2
3
2 2 3 2
3
1 2
3
样例输出
Case #1:
1
2
2

3

简单模拟题

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

int t,n,m,q,x,y,z,type;
int a[102][102];
int sex[102];

int main()
{
    scanf("%d",&t);
    for(int item = 1; item <= t; item ++){
        scanf("%d%d%d",&n,&m,&q);

        memset(a,0,sizeof(a));
        for(int i = 1; i <= n; i ++){
            scanf("%d",&sex[i]);
        }

        for(int i = 0; i < m; i ++){
            scanf("%d%d%d",&x,&y,&z);
            a[x][y] = z;
            a[y][x] = z;
        }

        printf("Case #%d:\n",item);
        for(int i = 0; i < q; i++){
            scanf("%d",&type);

            if(type == 1){
                scanf("%d",&x);
                sex[x] = sex[x] ^ 1;
            }
            else if(type == 2){
                scanf("%d%d%d",&x,&y,&z);
                a[x][y] = a[y][x] = z;
            }
            else{
                int ans = 0;
                for(int j = 1; j <= n; j++){
                    for(int k = j + 1; k <= n; k++){
                        if(sex[j] != sex[k]){
                            ans += a[j][k];
                        }
                    }
                }
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}

题目1 : 扑克牌

时间限制: 2000ms
单点时限: 1000ms
内存限制: 256MB

描述

一副不含王的扑克牌由52张牌组成,由红桃、黑桃、梅花、方块4组牌组成,每组13张不同的面值。现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数。

牌的表示方法为XY,其中X为面值,为2、3、4、5、6、7、8、9、T、J、Q、K、A中的一个。Y为花色,为S、H、D、C中的一个。如2S、2H、TD等。

输入

第一行为一个整数T,为数据组数。

之后每组数据占一行。这一行首先包含一个整数N,表示给定的牌的张数,接下来N个由空格分隔的字符串,每个字符串长度为2,表示一张牌。每组数据中的扑克牌各不相同。

输出

对于每组数据输出一行,形如"Case #X: Y"。X为数据组数,从1开始。Y为可能的方案数,由于答案可能很大,请输出模264之后的值。

数据范围

1 ≤ T ≤ 20000

小数据

1 ≤ N ≤ 5

大数据

1 ≤ N ≤ 52


样例输入
5
1 TC
2 TC TS
5 2C AD AC JC JH
4 AC KC QC JC
6 AC AD AS JC JD KD
样例输出
Case #1: 1
Case #2: 0
Case #3: 48
Case #4: 24
Case #5: 120
打表枚举

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

int t,n;
char a[2];
int num[15];
int cou[5];

void add(char a[]){
    int tmp;
    if(a[0] >= '2' && a[0] <= '9')
        tmp = a[0] - '0';
    else if(a[0] == 'T')
        tmp = 10;
    else if(a[0] == 'J')
        tmp = 11;
    else if(a[0] == 'Q')
        tmp = 12;
    else if(a[0] == 'K')
        tmp = 13;
    else
        tmp = 14;
    num[tmp] ++;
}

int main()
{
    scanf("%d",&t);
    for(int item = 1; item <= t; item ++){
        scanf("%d",&n);
        memset(num,0,sizeof(num));

        for(int i = 0; i < n; i ++){
            cin.get();
            scanf("%s",a);
            add(a);
        }

        memset(cou, 0, sizeof(cou));
        for(int i = 2; i <= 14; i ++){
            cou[num[i]] ++;
        }

        int ans;
        if(n == 1){
            ans = 1;
        }
        else if(n == 2){
            if(cou[1] == 2) ans = 2;
            else ans = 0;
        }
        else if(n == 3){
            if(cou[3] == 1) ans = 0;
            else if(cou[2] == 1) ans = 2;
            else ans = 6;
        }
        else if(n == 4){
            if(cou[4] == 1) ans = 0;
            else if(cou[3] == 1) ans = 0;
            else if(cou[2] == 2) ans = 8;
            else if(cou[2] == 1 && cou[1] == 2) ans = 12;
            else ans = 24;
        }
        else if(n == 5){
            if(cou[4] == 1) ans = 0;
            else if(cou[2] == 1 && cou[3] == 1) ans = 12;
            else if(cou[1] == 2 && cou[3] == 1) ans = 12;
            else if(cou[2] == 2 && cou[1] == 1) ans = 48;
            else if(cou[2] == 1 && cou[1] == 3) ans = 72;
            else if(cou[1] == 5) ans = 120;
        }
        printf("Case #%d: %d\n",item, ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值