ACM实训冲刺第二十四天

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(频率统计题)

这段代码实现的算法主要是计数/统计分析。

程序的功能是这样的:

  1. 输入一个整数T,表示需要处理的测试用例数量。
  2. 对于每个测试用例:
    • 初始化一个长度为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 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值