题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5174
说实话没怎么看懂题意。后来按照自己理解写了一发。
我的理解是这样。输入n个人的价值后,每个人去找缆车,只能上与自己价值相同的缆车。所以刚开始我先对每种价值统计人数,然后对所以不同价值的缆车排序后,判断是否满足条件。
输入的价值存在val[]数组里面,统计后存在arr[][]数组中。
例如
6
2 3 1 2 7 5
则 先对val数组排序,后得
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
1 | 2 | 2 | 3 | 7 | 5 |
然后统计
arr[i][0] | arr[i][1] | |
---|---|---|
0 | 1 | 1 |
1 | 2 | 2 |
2 | 3 | 1 |
3 | 5 | 1 |
4 | 7 | 1 |
注意若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;
}