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;
}