#贪心+等差/比数列<序列><嚎叫响彻在贪婪的厂房>

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<map>
 4 #define MAXN 100010
 5 #define ll long long
 6 #define maxn(a,b) (a)>(b)?(a):(b)
 7 #define minn(a,b) (a)<(b)?(a):(b)
 8 using namespace std;
 9 inline ll read(){
10     ll s=0;
11     char ch=getchar();
12     while(ch<‘0‘||ch>‘9‘)ch=getchar();
13     while(ch>=‘0‘&&ch<=‘9‘)s=s*10+ch-‘0‘,ch=getchar();
14     return s;
15 }
16 map<ll,bool>h;
17 ll dp[MAXN],g[MAXN];
18 ll rn[MAXN],n;
19 ll ans=1;
20 inline ll gcd(ll a,ll b){
21     return b?gcd(b,a%b):a;
22 }
23 inline ll get_g(ll a,ll b){
24     if(a==b)return false;
25     if(!a||!b)return false;
26     ll lin;
27     if(a<b)swap(a,b);
28     lin=a/b;
29     if(lin*b!=a)return false;
30     return lin;
31 }
32 bool pd(ll a,ll b){
33     if(a==b)return true;
34     if(!get_g(a,b))return false;
35     ll tmp;
36     while(1){
37         if(a<b)swap(a,b);
38         if(b==1)return true;
39         if(gcd(a,b)!=b){
40             return false;
41         }
42         a/=b;
43     }
44     return true;
45 }
46 int main(){
47 //    freopen("da.in","r",stdin);
48     n=read();
49     for(int i=1;i<=n;++i)rn[i]=read();
50     ans=1;
51     ll llen=1;
52     bool cong=0;
53     for(int i=1;i<=n;++i){
54         if(!cong){
55             llen=1;
56             cong=1;
57             continue;
58         }
59         if(rn[i]!=rn[i-1]){
60             ans=maxn(ans,llen);
61             cong=0;
62             llen=0;
63             --i;
64             continue;
65         }
66         ++llen;
67         ans=maxn(llen,ans);
68     }
69     ans=maxn(ans,llen);
70     for(int i=1;i<n;++i){
71         h.clear();
72         int r=i+1;
73         g[r]=get_g(rn[r-1],rn[r]);
74         if(!g[r]){
75             continue;
76         }
77         dp[r]=2;
78         h[rn[r]]=true;
79         h[rn[r-1]]=true;
80         ans=maxn(ans,dp[r]);
81         for(r=i+2;r<=n;++r){
82             g[r]=get_g(rn[r-1],rn[r]);
83             if(h[rn[r]])break;
84             if(!g[r]){
85                 break;
86             }
87             if(!pd(g[r],g[r-1])){
88                 break;
89             }
90             h[rn[r]]=true;
91             g[r]=maxn(g[r],g[r-1]);
92             dp[r]=dp[r-1]+1;
93             ans=maxn(dp[r],ans);
94         }
95     }
96     printf("%lld\n",ans);
97 }

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<map>
 4 #include<cmath>
 5 #include<iostream>
 6 #define reg register
 7 #define INF 0x7fffffff
 8 #define int long long
 9 using namespace std;
10 inline int minn(int a,int b){return a<b?a:b; }
11 inline int maxn(int a,int b){return a>b?a:b; }
12 inline int read(){
13     int s=0,w=0;char ch=getchar();
14     while(ch<‘0‘||ch>‘9‘)w|=(ch==‘-‘),ch=getchar();
15     while(ch>=‘0‘&&ch<=‘9‘)s=s*10+ch-‘0‘,ch=getchar();
16     return w?-s:s;
17 }
18 #define kd (read())
19 const int MAXN=100010;
20 int N;
21 int rn[MAXN];
22 int gcd(int a,int b){return b?gcd(b,a%b):a; }
23 int ans=0;
24 map<int ,bool >mp;
25 signed main(){
26     //freopen("da.in","r",stdin);
27     N=kd;
28     for(reg int i=1;i<=N;++i)rn[i]=kd;
29     bool xj=1;
30     int gx=0;
31     int pos=1;
32     while(pos<=N){
33         if(xj){
34             mp.clear();
35             ++ans;
36             if(pos==N)break;
37             if(rn[pos]!=rn[pos+1]&&abs(rn[pos]-rn[pos+1])!=1){
38                 gx=maxn(rn[pos+1]-rn[pos],rn[pos]-rn[pos+1]);
39                 mp[rn[pos]]=1;
40                 mp[rn[pos+1]]=1;
41                 xj=0;pos=pos+2;
42             }
43             else xj=1,++pos;
44         }
45         else{
46             int tt=gcd(maxn(rn[pos]-rn[pos-1],rn[pos-1]-rn[pos]),gx);
47             if(tt>1&&!mp[rn[pos]])gx=tt,mp[rn[pos]]=1,++pos;
48             else xj=1;
49         }
50     }
51     printf("%lld\n",ans);
52 }

先丢两个代码,两道题还是很像的。序列里的一个点肯定是尽量和其他的合并,如果考虑从前往后扫,那么这个点能和前面的合并(条件满足情况下)一定不吃亏,所以硬扫O(N)。

不过,细节还是挺多的,比如数列中一定不能有相同的数。还有<嚎叫响彻在贪婪的厂房>中对公差大于1的要求

while(pos<=N){
		if(xj){
			mp.clear();
			++ans;
			if(pos==N)break;
			if(rn[pos]!=rn[pos+1]&&/*/*/abs(rn[pos]-rn[pos+1])!=1/*/*/){//判公差不为1
				gx=maxn(rn[pos+1]-rn[pos],rn[pos]-rn[pos+1]);
				mp[rn[pos]]=1;
				mp[rn[pos+1]]=1;
				xj=0;pos=pos+2;
			}
			else xj=1,++pos;
		}
		else{
			int tt=gcd(maxn(rn[pos]-rn[pos-1],rn[pos-1]-rn[pos]),gx);
			if(tt>1&&!mp[rn[pos]])gx=tt,mp[rn[pos]]=1,++pos;
			else xj=1;
		}
	}

 不够细心鸭!

原文地址:https://www.cnblogs.com/2018hzoicyf/p/11376163.html

时间: 2024-10-04 10:51:52

#贪心+等差/比数列<序列><嚎叫响彻在贪婪的厂房>的相关文章

第二题等差素数列

第二题 标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列. 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为10的等差素数列,其公差最小值是多少? 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字. #include<iostre

2017第八届蓝桥杯C/C++ B组省赛-等差素数列

标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列. 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为10的等差素数列,其公差最小值是多少? 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字. 比赛的时候有点混乱,结果连暴力都没暴力

等差素数数列

程序地址:http://www.cheemoedu.com/exercise/27 问题描述: 类似7.37.67.97.107.137.167.197,这样由素数组成的数列叫做等差素数数列.素数数列具有项数的限制,一般指素数数列的项数有多少个连续项,最多可以存在多少个连续项.编程找出100以内的等差素数数列. 示例代码: 解题步骤: #1. 筛法找到100所有素数 #2. 对于素数list内素有俩两组合,构造等差数列a0, a1项 #3. 计算出a2, 查表判断a2是否是素数,是素数则能构成素

【蓝桥杯】最长等差素数数列

[题目] 在小于10的素数中有3.5.7组成的等差数列,在小于30的素数中有11.17.23.29组成的等差数列. 试找出区间[100,1000]内的素数构成的最大等差数列(即等差数列包含的素数个数最多)并打印输出. [关键字] 素数:等差数列 [思路] 先用一个数组标记出 100 ~ 1000 之间哪些是素数: 差值从 2 ~ 900 进行循环判断 [实现] 1 #include <stdio.h> 2 #define N 1001 3 #define MAX_CHA 900 4 5 voi

luogu P1415 拆分数列 序列DP

做起来不太难,但是很难想的一道题. 分两个步骤,第一个步骤是先求出,最后一个数字是多少. 我们考虑d[i]表示,[1,i]最后一个数字最小情况下,最后一个数字的开始位置. 那转移方程很显然,d[i] = j(满足s[d[j - 1],j - 1]<s[j,i],且j距离i最近,这样子最小). 这样我们就求除了最后一个数字是多少. 第二步,我们类似的从后推一遍. 用f[i]表示,[i,n]第一个数字最大情况下,第一个数字的结束位置. 转移方程依旧显然,f[i] = j(满足s[i,j] < s[

Codeforces #550 (Div3) - G.Two Merged Sequences(dp / 贪心)

Problem  Codeforces #550 (Div3) - G.Two Merged Sequences Time Limit: 2000 mSec Problem Description Two integer sequences existed initially, one of them was strictly increasing, and another one — strictly decreasing. Strictly increasing sequence is a

Scala 具体的并行集合库【翻译】

原文地址 本文内容 并行数组(Parallel Array) 并行向量(Parallel Vector) 并行范围(Parallel Range) 并行哈希表(Parallel Hash Tables) 并行散列 Tries(Parallel Hash Tries) 并行并发 Tries(Parallel Concurrent Tries) 参考资料 并行数组(Parallel Array) 一个 ParArray 序列包含线性.连续的元素数组.这意味着,通过修改底层数组,可以高效地访问和修改元

2017第八届蓝桥杯C/C++ B组省赛个人代码

第一题 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的. 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定. 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物. 取款机只能提供100元面额的纸币.小明想尽可能少取些现金,够用就行了. 你的任务是计算出,小明最少需要取多少现金. 以下是让人头疼的购物单,为了保

Python 趣味百题

趣味整数 1 不重复的3位数 -易 2 水仙花数 -易 3 完全数 -中 4 相亲数 -中 5 黑洞数 -中 6 勾股数 -易 7 自守数 -易 8 3位反序数 -中 趣味素数 1 素数 -中 2 孪生素数 -中 3 金蝉素数 -中 4 可逆素数 -中 5 回文素数 -中 6 平方回文素数 -中 7 梅森尼数 -中 8 哥德巴赫猜想 -中 9 等差素数数列 -中 趣味图形 1 回型矩阵 -中 2 九九乘法表 -易 3 杨辉三角 -易 数学问题 1 天平秤物 -难 2 黑色星期五 -易 3 存钱问