#2018蓝桥杯 自用

这篇博客探讨了二进制数的表示,包括正负数转换;高精度计算中遇到的问题,特别是处理零的个数;快速排序算法的实现及寻找数组中第k大元素的方法;以及螺旋折线图形的规律。同时,还涉及到了日志统计中的时间窗口计数和全球变暖模拟中岛屿数量的判断。
摘要由CSDN通过智能技术生成

看题目点击这里

T2名码

对二进制的不了解
以八位为例
 5的二进制有:00000101 前面是0-5的二进制有:11111011
 求法:把-5的绝对值求反码后在末尾+1
 00000101
 11111010
 11111011
 模拟法就行

T3乘积尾零

这个题目我用了高精度,但是存在一个问题,
好像是读0的个数时出现了问题,导致输出29而非31
我看到有人用文件夹输出好像就得到31了

所以有些问题真的是要简化题目,不要用笨办法(~ ̄(OO))

T5快速排序

首先我认为我们要了解快速排序
快速排序看这里了解

这里的区间是改变的,总的来说方向是总体向右移动,当到了下一个区间,我们所求的第k大的元素在当前的区间内可不是第k大了哦,要减去你移动的距离才是当前区间所求的目标值。

#include <bits/stdc++.h>
using namespace std;
int quick_select(int a[], int l, int r, int k) {
	int p = rand() % (r - l + 1) + l;
	int x = a[p];
	{int t = a[p]; a[p] = a[r]; a[r] = t;}
	int i = l, j = r;
	while(i < j) {
		while(i < j && a[i] < x) i++;
		if(i < j) {
			a[j] = a[i];
			j--;
		}
		while(i < j && a[j] > x) j--;
		if(i < j) {
			a[i] = a[j];
			i++;
		}
	}
	a[i] = x;
	p = i;
	if(i - l + 1 == k) return a[i];
	if(i - l + 1 < k) return quick_select(a, i+1, r, k-(i-l+1)); //填空
	else return quick_select(a, l, i - 1, k);
}
	
int main()
{
	int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
	printf("%d\n", quick_select(a, 0, 14, 5));
	return 0;
}

T7螺旋折线

#include<bits/stdc++.h>
using namespace std;
//思路:
//1.首先得到x轴y轴上的规律:只看x轴,-1与+1差值为4,-2与+2差值为4+4 ...4+4+4..然后y轴也类似
//2.当x>y时看x,值为 x轴上的值+-y值 
//	当y>x时看y,值为 y轴上的值+-x值 
//	当x=y时 值就等于x与y轴上分别的值的平均数 
#define max 100000000
int x[max];
int y[max];//最多只能带8个0,但百分百数据是9个0,怎么搞??? 
int main()
{
	//先想办法构造我们的xy轴数组,用斜方向上的数的规律来填写数组。 
	x[0] = y[0] = 0;
	x[1] = 5, y[1] = 3;
	int add = 4, t = 0;
	for(int i=1; i<=100000000; i++)
	{
		t = add + t;
		add = add + 8;
		x[i] = t+i;
		y[i] = t-i;
	}
	//开始解题 
	int tx, ty;
	cin >> tx >> ty;
	if(tx>ty)
		printf("%d", x[tx]+ty);
	else if(x<y)
		printf("%d", y[ty]+tx);
	else
		printf("%d", x[tx]+y[ty]/2);
		
	return 0;
}

T8日志统计

#include<bits/stdc++.h>
using namespace std;
int n, d, k;//n:个数 d:时间 k:不少于多少赞 
int ts, id;   //a:shi
int cid[1000000][2];//存id

int main()
{
	cin >> n >> d >> k;
//	printf("%d %d %d %d\n", cid[1], cid[2], cid[3], cid[4]);
	for(int i=1; i<=n; i++)
	{
		cin >> ts >> id;
//		printf("i:%d abs:%d [0]:%d [1]:%d\n", i, abs(ts - cid[id][1]), cid[id][0], cid[id][1]);
		if(abs(ts - cid[id][1]) < d || cid[id][0] == 0)
		{
			if(cid[id][0] == 0)
				cid[id][1] = ts;	
			cid[id][0]++;
		}
	}
	
	for(int i=0; i<=100000; i++)
	{
//		printf("cid[i][0]:%d cid[i][1]:%d i:%d k:%d\n", cid[i][0], cid[i][1], i, k);
		if(cid[i][0]>=k) printf("\n%d", i);
	}
	return 0;
}
//7 10 2  
//0 1    r1 
//0 10   r10
//10 10  f
//10 1   f
//9 1		 r1
//100 3	 f 
//100 3  f

T9全球变暖

#include<bits/stdc++.h>
using namespace std;
/*首先要判断有多少个岛屿	如何判断?如何可以解决的话可用模拟,
虽然不是正确的思想但是我现在只能想到这个办法*/ 
//在把图上边缘的 #去掉
//再判断还剩下多少岛屿
//把两值求差 
int main()
{
	
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值