当前位置: 首页 > wzjs >正文

成品网站源码的优化技巧济南网站建设山东聚搜网咨询

成品网站源码的优化技巧,济南网站建设山东聚搜网咨询,用dw做购票网站,网站后台补丁如何做思路详解在注释 1. T1:数字统计(count)给定两个整数n和x,计算在区间1到n的所有整数中(无前导零十进制表示),数字x一共出现的次数。签到题,暴力即可 代码不放了2. T2:次大值求和(sum)给定一个1到…

思路详解在注释 

1. T1:数字统计(count)

     给定两个整数n和x,计算在区间1到n的所有整数中(无前导零十进制表示),数字x一共出现的次数。
签到题,暴力即可  代码不放了

2. T2:次大值求和(sum)

    给定一个1到n的数字各出现一次的排列a[1]、a[2]、…、a[n],定义f(l,r)表示a[l]、a[l+1]、a[l+2]、…、a[r]中的次大值,你需要求出对于所有的1<=i<j<=n,f(i,j)的和。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
int n,l[N],r[N];
ll ans;
struct sty{int x,id;
}a[N];
bool cmp(struct sty x,struct sty y){return x.x<y.x;
}
/*
考虑 30pts 的作法我们可以直接枚举每个区间的左右端点 l r,
然后用 O(n) 的时间求出次大值并累加,时间复杂度 O(n^3)。
然后我们会发现一个区间的次大值可以由上一个区间转移过来,
故可以将时间复杂度优化为 O(n^2),期望得分 70pts。
可以观察到之前我们所有的算法思想无外乎是以统计区间为主的。
这里我们转化一下思想,我们其实可以枚举每一个数作为次大值时是哪些区间。
当一个数作为次大值时。设她右边第一个比她大的数与她的距离为 d1 ,
设左边第一个比她大的数与她的距离为 d2 。
则所有以她为次大值的区间个数就是 d1(d2-1)+d2(d1-1)->乘法原理。
内心:看不懂一点公式…………………………
但是找到某个数左边的比她大的数和右边比她大的数又要花费我们 O(n) 的时间,
考虑如何优化:其实可以用单调队列等多种数据结构优化,但我这边用的是双向链表:
我们先排序,然后从小到大枚举,每枚举完一个数就将这个数删掉,
容易发现这时每个数左边第一个数便是原数列中第一个她大的,右边同理。
时间复杂度 O(nolgn+n) 期望得分 100pts
*/ 
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i].x); //第i个数对应的值 a[i].id=i; //第几个数 }sort(a+1,a+n+1,cmp); //按照值从小到大进行排序 for(int i=1;i<=n;i++) {l[i]=i-1,r[i]=i+1; //初始化i的左边和i右边的值 } r[n+1]=n+1;//防止在查询右操作(就是右边的右边)时,k2=0,但左操作不会 
//	for(int i=0;i<=n+1;i++){
//		printf("%d %d\n",l[i],r[i]);
//	} for(int i=1;i<=n;i++){int x=a[i].id; int j1=l[x];//当前的左边 int j2=l[j1];//当前的左边的左边int k1=r[x];//当前的右边int k2=r[k1];//当前的右边的右边      l[r[x]]=l[x];r[l[x]]=r[x];//删除当前节点 
//      for(int i=0;i<=n+1;i++){
//		printf("\n%d %d\n",l[i],r[i]);
//	} ans=ans+(ll)i*((j1-j2)*(k1-x)+(k2-k1)*(x-j1));/*为什么要乘i,因为当你在第i小时,只可能有i种选择例:4 2 3 1 ----> 1 2 3 4所在区间次大值是1:1 2所在区间次大值是2: 2 3 / 1 2 3所在区间次大值是3: 3 4 / 2 3 4 / 1 2 3 4所在区间次大值是4:无,因为他最大,虽然看上去乘了,但由于 (j1-j2)*(k1-x)+(k2-k1)*(x-j1)一定为 0,等于没有乘 d1(d2-1)+d2(d1-1):举个例子:2(l2) 0 3(l1) 1(x) 0 2(r1) 3(r2)l1-l2意思是i左侧当i作为次大值是有几个区间,r1-x意思是既然在左侧i已经为次大值了,那么在右侧一直到下一个比它大的值之前的所有区间即为所求(因为从大到小,下一个i连的点即为比它大的点)加号右侧相反,同理*/}printf("%lld\n",ans);return 0;
}


3. T3:优先队列题

     给定n个整数a[i]和一个整数m,对于所有1<=i<=n和1<=j<=n,求出a[i]+a[j],然后将所有求得的n^2个a[i]+a[j]的数值从大到小排序,你需要求出排序后前m个数的和。

思路:把ai+aj的和放进队列,当数量大于m后,剔除最小的,而ai+aj<q.top()时,说明接下来的ai+aj都小于q.top(),直接退出即可,这样使时间复杂度降低

     代码:

#include <bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int a[100001];
bool cmp(int a,int b) {return a>b;
} 
int main(){int n,m;long long ans=0;cin>>n>>m;for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+1+n,cmp);int Size=0;for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){q.push(a[i]+a[j]);Size++;if(Size>m){q.pop();if(a[i]+a[j]<q.top()) break;}}} while(!q.empty()) ans+=q.top(),q.pop();cout<<ans;return 0;
}


4. T4 backpack

    给定n个物品和一个整数s,第i个物品的体积是a[i],定义f(l,r)表示在第l个物品到第r个物品中选出若干个物品的方案数,使得这些物品的体积之和为s。
你需要求出对于所有1<=l<=r<=n,f(l,r)的和。由于答案可能很大,你只需要输出答案对998244353取模的结果。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=998244353,N=3e3+10;
int n,a[N],s,f[N][N];
ll ans=0;
/*这代码的恶心点在于它的i指的不是平时的1~i中有几种可能性
而是1~i、2~i、……、i~i共i组可能性的和 
而且,它还代表了1~i+1、2~i+1……1~i+2、2~i+2…………
中只使用这i组时的所有可能性 */
int main(){cin>>n>>s;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){for(int j=1;j<=3000;j++){//循环背包容量//但是我还是认为j到s就行了
//		如果容量刚好能放下这个物品时,光放这一个的可能性
//		一开始我也没看懂,但是悟了之后其实就很明显了:
//		加i是因为f[i][j]中共有i组,每组多一种可能性,便是i种if(j==a[i]) f[i][j]=(f[i][j]+i)%mod;//等于if(j==a[i]) Add(f[i][j],i); //没放的可能性 ,dp板子 f[i][j]=(f[i][j]+f[i-1][j])%mod;//等于Add(f[i][j],f[i-1][j]);//只要能放进去了总可能性中就一定会有没有a[i]时的方案数,所以加上if(j>=a[i]) {f[i][j]=(f[i][j]+f[i-1][j-a[i]])%mod; }//如果背包放满了,记录答案//*n-i+1是把所有含这i组且只用这i组中的可能性一口气加上 //因为直接一口气加上了,所以-f[i-1][j]防止重复加 if(j==s) {ans=(ans+(1ll*(f[i][j]+mod-f[i-1][j])%mod*(n-i+1)%mod)%mod)%mod;}//1ll意思是运算中可能会超int,所以运算中先开成long long,运算结束后//再赋值回int,防止爆掉(实际看代码时当不存在就好了) }}cout<<ans<<endl;return 0;
}
http://www.dtcms.com/wzjs/594093.html

相关文章:

  • 注册一个做网站的公司好wordpress 图库主题
  • 昆山网站建设犀牛大叔厦门中信网站
  • 免费空间建站网站推荐定制网站与模板网站的主要区别
  • 求职网站开发多少钱怎么注册网站的步骤
  • 专业的天津网站建设网站备案费一般是多少
  • 宁波网站建设公司哪里有做图标的网站
  • 宁夏建设工程招标投标信息管理中心网站中国建设银行网站怎么改支付密码忘了怎么办
  • 红酒网站设计莱芜金点子广告电子版最新
  • 衡水网络推广 衡水网站建设国外画册设计网站
  • 怎样做医疗网站不违法抖音创作服务平台
  • 创意灵感网站网站开发专业就业前景
  • 东莞网站建设公司怎么做电脑装wordpress
  • 做直播大秀的平台和网站外包公司劳动合同
  • 合肥怎么做网站网站开发营销型
  • 做销售在哪些网站注册好一个空间开几个网站
  • 用word做网站首页济南比较好的网站建设公司
  • 做网站发违规内容 网警抓不抓宁波搭建网站价格
  • 某某网站建设策划书2000字东莞整合网站建设
  • 繁昌网站建设开发一栋楼需要多少钱
  • 学风建设网站唐山网页搜索排名提升
  • 固原微信网站建设做软件外包公司
  • 安全培训网站做外汇看的国外网站
  • 西安网站建设哪个平台好专业做网站设计公司价格
  • 网站建设中模板 模板无忧西安市城乡建设档案馆网站
  • vps 需刷新几次才能打开网站网站免费备案
  • 用阿里云建设网站百度网站建设要多少钱
  • 江苏建设工程招标网站连云港网站建设wang
  • 做下载网站用阿里云的什么产品网站做推广需要什么
  • 湖北现代城市建设集团网站sae+wordpress
  • 西安wordpresswordpress如何做优化