基础算法题——P2926 [USACO08DEC]Patting Heads S(思维转变、剪枝)

博客介绍了USACO竞赛中的Patting Heads S问题,涉及N头奶牛围成一圈,每头牛拍打数字能整除自己纸条数字的牛的头。博主分享了从暴力解法到逐步优化的解题思路,包括统计数字频率和加快查找速度的优化方法,最终实现AC解决方案。
摘要由CSDN通过智能技术生成
Patting Heads S

今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏。
贝茜让 N(1 ≤ N ≤ 10 5) 头奶牛坐成一个圈。除了 1 号与 N 号奶牛外,i 号奶牛与 i-1 号和 i+1 号奶牛相邻。N 号奶牛与 1 号奶牛相邻。农夫约翰用很多纸条装满了一个桶,每一张包含了一个不一定是独一无二的 1 到 106 的数字。

接着每一头奶牛 i 从柄中取出一张纸条 Ai。每头奶牛轮流走上一圈,同时拍打所有手上数字能整除在自己纸条上的数字的牛的头,然后做回到原来的位置。牛们希望你帮助他们确定,每一头奶牛需要拍打的牛。

输入输出样例
输入 #1
5
2
1
2
3
4
输出 #1
2
0
2
1
3
说明/提示
有五只牛编号分别为2,1,2,3,4。
第一只牛被第二只、第三只牛拍,一共拍了 2 下。


下面我写了三种方案,本质相同,只是查询、存储上不同。

暴力法 ------ O(n2)
解题思路

管他三七二十一,直接把每头牛的编号从1倍开始都加上 1 ,最终输出答案减去自己就行!

#include<bits/stdc++.h>
using namespace std;
int A[100010], ans[1000010];

int main(){
   
//	freopen("data.txt", "r", stdin);
	int n;
	scanf("%d", &n);
	for(int i=0; i<n; i++){
   
		scanf("%d", &A[i]);
		for(int j=1; j*A[i]<=1000000; j++){
   
			ans[j*A[i]]++;
		}
	}
	
	for(int i=0; i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值