#184. Products

没办法,这题长得就是个数据结构好题,想了两三个小时的线段树也不能怪我。

过分的是,中午我还跑去跟lbc说这题是个数据结构好题,就有点搞笑了,不知道他现在怎么看我。。。

施大orz告诉我们,这题应该用倍增来做。

首先写一个nlogn的check(l,r)函数,来判断区间[l,r]是否符合题意。

考虑一个TLE的倍增,就是从一个点l开始,从大到小枚举t,当check(l,l+(1<<t))==1时就往前跳,然后就没有然后了。

前面全是废话,接下来才是重点

施大说,从一个点开始先从小到大枚举t,枚举到最大的t使check(l,l+(1<<t))==1后往前跳,然后再从大到小枚举t继续跳。复杂度玄学,但想想还是可以快一些的。

这个代码太丑了,用来对拍还可以,千万别拿去抄。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define rep(i,j,k) for(i=j;i<=k;++i)
#define per(i,j,k) for(i=j;i>=k;--i)
#define sqr(i) i*i
#define ll long long
#define pli pair<ll,int>
#define mkp make_pair
#define X first
#define Y second
const int N=500005;
ll n,m,k,a[N],b[N],cs,ans;
bool check(ll l,ll r){
	ll i,x,y,sum=0;
	rep(i,l,r)b[i]=a[i];
	sort(b+l,b+r+1);
	rep(i,0,m-1){
		x=l+i;y=r-i;
		if(x>=y)break;
		sum+=(b[x]-b[y])*(b[x]-b[y]);
	}
	return sum<=k;
}
int main(){
	ll i,l,r,t;
	scanf("%lld%lld%lld",&n,&m,&k);
	rep(i,1,n)scanf("%lld",&a[i]);
	for(cs=0;(1<<cs)<n;++cs);
	for(l=1;l<=n;++ans,l=r+1){
		rep(t,1,cs){
			r=l+(1<<t)-1;
			if(!check(l,r))
				break;
		}
		r=l+(1<<t-1)-1;
		for(t-=2;t>=0;--t){
			if(check(l,r+(1<<t)))r+=1<<t;
		}
	}
	printf("%lld\n",ans);
	return 0;
}

print("开始执行推荐算法....") #spark.sql(etl_sql).write.jdbc(mysql_url, 'task888', 'overwrite', prop) # 获取:用户ID、房源ID、评分 etl_rdd = spark.sql(etl_sql).select('user_id', 'phone_id', 'action_core').rdd rdd = etl_rdd.map(lambda x: Row(user_id=x[0], book_id=x[1], action_core=x[2])).map(lambda x: (x[2], x[1], x[0])) # 5.训练模型 model = ALS.train(rdd, 10, 10, 0.01) # 7.调用模型 products_for_users_list = model.recommendProductsForUsers(10).collect() # 8.打开文件,将推荐的结果保存到data目录下 out = open(r'data_etl/recommend_info.csv', 'w', newline='', encoding='utf-8') # 9.设置写入模式 csv_write = csv.writer(out, dialect='excel') # 10.设置用户csv文件头行 user_head = ['user_id', 'phone_id', 'score'] # 12.写入头行 csv_write.writerow(user_head) # 13.循环推荐数据 for i in products_for_users_list: for value in i[1]: rating = [value[0], value[1], value[2]] # 写入数据 csv_write.writerow(rating) print("推荐算法执行结束,开始加工和变换推荐结果....") # 14.读取推荐的结果 recommend_df = spark \ .read \ .format('com.databricks.spark.csv') \ .options(header='true', inferschema='true', ending='utf-8') \ .load("data_etl/recommend_info.csv") # 注册临时表 recommend_df.createOrReplaceTempView("recommend") # 构造 spark执行的sql recommend_sql = ''' SELECT a.user_id, a.phone_id, bid,phone_name, phone_brand, phone_price, phone_memory ,phone_screen_size,ROUND(score,1) score FROM recommend a,phone b WHERE a.phone_id=b.phone_id ''' # 执行spark sql语句,得到dataframe recommend_df = spark.sql(recommend_sql) # 将推荐的结果写入mysql recommend_df.write.jdbc(mysql_url, 'recommend', 'overwrite', prop) 解释一下这段代码
最新发布
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值