2017hbcpc(第一届河北省大学生程序设计竞赛)

这篇博客介绍了多个程序设计竞赛题目,包括超级密码、斗地主游戏、考研情况分析以及自动签到机等,涉及算法和逻辑推理。题目解析涵盖了从简单的数字解密到复杂的游戏策略和概率计算,适合程序员和竞赛爱好者阅读。
摘要由CSDN通过智能技术生成

题目链接: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&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值