Drying(二分查找)
这段代码实现的算法属于二分查找(Binary Search)算法。其主要用于在有序数组中查找特定元素或者查找满足某种条件的边界值。在这个场景中,算法是用来找到最短时间`l`,使得通过喝快乐水增加快乐点数,能够满足所有死宅达到他们的快乐需求。通过不断地将搜索区间缩小一半(根据当前猜测的中间值`m`计算得到的额外快乐点数总和`sum`与`m`比较),最终确定最少需要的时间。因此,核心算法是二分查找。
/*
1.读取死宅数量 n
2.每个死宅需要快乐a[i]点
3.所有死宅中最大的快乐需求数 ma
4.读取每个死宅需要的快乐点数
5.读取喝快乐水增加的快乐点数k
6.特殊情况k==1
7.二分法计算最短时间 l r m sum(累加额外分数)
8.输出最短时间l
*/
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int a[n];
int ma=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
ma=max(ma,a[i]);
}
int k;
scanf("%d",&k);
if(k==1){
printf("%d\n",ma);
return 0;
}
int l=0,r=ma,m;
while(l<r){
m=(l+r)/2;
long long sum=0;
for(int i=0;i<n;i++){
if(a[i]>m){
sum+=(a[i]-m)/(k-1)+((a[i]-m)%(k-1)!=0);
}
}
if(sum>m){
l=m+1;
}else{
r=m;
}
}
printf("%d\n",l);
return 0;
}
Digit Counting(频率统计题)
这段代码实现的算法主要是计数/统计分析。
程序的功能是这样的:
- 输入一个整数
T
,表示需要处理的测试用例数量。- 对于每个测试用例:
- 初始化一个长度为10的整型数组
cnt
用于记录数字0-9各自出现的次数,初始化所有元素为0。- 输入一个整数
n
,表示需要分析的正整数范围是1到n。- 遍历从1到n的每个整数i:
- 将整数i逐位分解,对每一位数字进行计数(即增加对应下标的
cnt
数组的值)。- 遍历并打印数组
cnt
,输出每个数字0-9在1到n的所有整数中出现的次数。因此,从算法的角度看,它主要涉及到迭代(遍历1到n的整数以及分解每个整数的每位数字)和计数(统计每个数字出现的频率)。这种类型的问题解决策略可以视为一种基础的数据处理或统计分析算法。
#include<stdio.h>
#include<string.h>
int cnt[10];
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(cnt,0,sizeof(cnt));
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int num=i;
while(num){
cnt[num%10]++;
num/=10;
}
}
for(int i=0;i<n;i++)
printf("%d\n",cnt[i]);
}
return 0;
}
Oil Deposits (dfs)
属于冲刺类型的
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int r, c;
int fx[9] = {0, 0, 1, -1, -1, -1, 1, 1}, fy[9] = {1, -1, 0, 0, -1, 1, -1, 1};
char mapp[105][105];
int s;
// 深度优先搜索函数,遍历与当前位置相邻的油桶
void dfs(int x, int y) {
mapp[x][y] = '*';
for (int i = 0; i < 8; i++) {
int a = x + fx[i];
int b = y + fy[i];
if (a > 0 && a <= r && b > 0 && b <= c && mapp[a][b] == '@') {
dfs(a, b);
}
}
}
int main() {
while (scanf("%d %d", &r, &c) == 2 && r != 0) {
s = 0;
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
scanf(" %c", &mapp[i][j]);
}
}
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
if (mapp[i][j] == '@') {
dfs(i, j);
s++;
}
}
}
printf("%d\n", s);
}
return 0;
}
题型统计
练习题名称 | 数学计算与序列求和 | 数值运算与字符串处理 | 频率统计题 | 数据处理与逻辑判断 | 0-1背包问题 | 最大覆盖半径 | 二分查找 | dfs |
SUM Problem | √ | |||||||
A+B problem | √ | |||||||
Anton and letters | √ | |||||||
Sum of digits | √ | |||||||
寒冰王座 | √ | |||||||
Charm Bracelet | √ | |||||||
Vanya and Lanterns | √ | |||||||
Anton and Danik | √ | |||||||
人见人爱A^B | √ | |||||||
Tokitsukaze and All Zero Sequence | √ | |||||||
Aggressive cows | √ | |||||||
Brainman | √ | |||||||
统计元音 | √ | |||||||
Let the Balloon Rise | √ | |||||||
0-1 Knapsack Problem | √ | |||||||
Drying | √ | |||||||
Digit Counting | √ | |||||||
Oil Deposits | √ |