题目链接:http://newoj.acmclub.cn/contests/1484
还是太菜,好多题目还是不会。
1841.超级密码
题目描述
小明今年9岁了,最近迷上了设计密码!今天,他又设计了一套他认为很复杂的密码,并且称之为“超级密码”. 说实话,这套所谓的“超级密码”其实并不难:对于一个给定的字符串,你只要提取其中的数字,然后连在一起构成一个整数,再乘以小明的幸运数字513,就是解密后的结果了~比如,字符串“ads2d4,122”,提取后的整数是24122,然后乘以513,就能得到解密后的结果:12374586.注:题目保证解密后的结果在32位无符号整数范围.
输入描述
输入首先包括一个正整数N,表示有N组测试用例. 每组数据占一行,包含一个长度不超过30的字符串.
输出描述
请根据题目要求输出解密后的结果,每组数据输出一行.
样例输入
2
ads2d4,122
0023asdf2AA90
样例输出
12374586
11947770
#include <stdio.h>
#include <string.h>
int main(void)
{
int n, len, base, ans;
char str[35];
scanf("%d", &n);
while (n--) {
base = 1;
ans = 0;
scanf("%s", str);
len = strlen(str);
for (int i = len - 1; i >= 0; i--) {
if (str[i] >= '0' && str[i] <= '9') {
ans += base * (str[i] - '0');
base *= 10;
}
}
ans *= 513;
printf("%d\n", ans);
}
return 0;
}
1842.斗地主
题目描述
alvin自从开了游乐园之后,经营的风生水起,没过多久就收回了成本.为了创建一个高端的娱乐帝国,alvin打算再开一个赌场,并且里面只会有alvin认为最好玩的游戏–斗地主. 开张第一天便生意火爆,有n个人来赌场玩斗地主.然而在斗地主界有一个规矩,那就是同一桌的三个人带的筹码的异或值为0,才能使参与游戏的三个人都感到愉快,并且称这一桌为“nice round”. 比如,若一共有三个人,所携带的筹码数分别为1,2,3,则 = 0,这便是一个“nice round”.若分别携带的筹码为1,2,4,则不是. 现在alvin的有个问题,这n个顾客可以组成多少个不同的“nice round”呢? Input
输入描述
有多组数据输入. 每组数据第一行包含一个整数n,代表有n个顾客. 接下来一行每行包含n个非负整数,代表n个顾客所携带的筹码数,其中ai代表第i个顾客的筹码数.
数据规模:
对于100%的数据,保证ai <= 500;
对于40%的数据,保证n <= 200;
对于100%的数据,保证n <= 5000.
输出描述
对于每组数据,输出一个整数,代表能够产生的不同的nice round的组数.每组一行.
样例输入
3
1 2 3
4
1 1 2 3
样例输出
1
2
n <= 5000,如果直接枚举复杂度为O(n^3),会TLE。因为ai是小于500的,可以用大小为500的数组来记录每个数字出现的次数。
还需要另外判断0和两个相同的数,三个0的情况
最后再枚举三个不同数的情况
特别需要注意的是==的优先级大于^,所以要加括号
#include <iostream>
#include <cstring>
using namespace std;
const int N = 5e3 + 5;
typedef long long ll;
ll a[N];//记录每个数出现的次数
int main(void)
{
ll n, t, ans;
while (cin >> n){
ans = 0;
memset(a, 0, sizeof a);
for (int i = 0; i < n; i++) {
cin >> t;
a[t]++;
}
//0和两个相同的数
if (a[0])
for (int i = 1; i <= 500; i++)
if (a[i] >= 2)
ans += a[i] * (a[i] - 1) / 2 * a[0];
//三个0
if (a[0] >= 3)
ans += a[0] * (a[0] - 1) * (a[0] - 2) / 6;
//三个不同的数
for (int i = 0; i <= 500; i++)
for (int j = i + 1; j <= 500; j++)
for (int k = j + 1; k <= 500; k&