Valentine's Day Round 1001 Ferries Wheel

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5174

说实话没怎么看懂题意。后来按照自己理解写了一发。
我的理解是这样。输入n个人的价值后,每个人去找缆车,只能上与自己价值相同的缆车。所以刚开始我先对每种价值统计人数,然后对所以不同价值的缆车排序后,判断是否满足条件。
输入的价值存在val[]数组里面,统计后存在arr[][]数组中。
例如
6
2 3 1 2 7 5
则 先对val数组排序,后得

012345
122375

然后统计

arr[i][0]arr[i][1]
011
122
231
351
471

注意若arr中只有一个行的话,直接输出-1,而不是n==1输出-1
然后都arr[i][0]做判断,若满足就加上arr[i][1]

代码如下

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#include <cstring>
using namespace std;

typedef long long ll;
const int maxn=11111111;
const int INF=0x7fffffff;
const int mod=1e7+7;
#define LSON l,m,rt<<1
#define RSON m+1,r,rt<<1|1
#define ESP 1e-7

ll val[105], arr[105][2];

int main() {
    int n, n_case=0;
    while(scanf("%d", &n)!=EOF) {
        printf("Case #%d: ", ++n_case);
        for(int i=0;i<n;i++)
            scanf("%lld", &val[i]);
        sort(val, val+n);
        memset(arr, 0, sizeof(arr));
        int k=1;
        arr[0][0]=val[0];
        arr[0][1]++;
        for(int i=1;i<n;i++) {
            if(val[i]==arr[k-1][0])
                arr[k-1][1]++;
            else {
                arr[k][0]=val[i];
                arr[k++][1]=1;
            }
        }
        if(k==1) {
            printf("%d\n", -1);
            continue;
        }
        int sum=0;
        if((arr[0][0]+arr[k-1][0])%INT_MAX==arr[1][0]) sum+=arr[0][1];
        if((arr[k-1][0]+arr[k-2][0])%INT_MAX==arr[0][0]) sum+=arr[k-1][1];
        for(int i=1;i<k-1;i++)
            if((arr[i][0]+arr[i-1][0])%INT_MAX==arr[i+1][0]) sum+=arr[i][1];
        printf("%d\n", sum);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值