【比赛链接】:click here~~
hdu 5328 : Problem Killer
【题意】:给一个数列,求最长的连续元素等差或等比数列的长度
【思路】:首先如果a,b,c是等差数列,且b,c,d是等比数列,那么a,b,c,d也是等差数列,对于等比数列,这个性质同样成立,所以只要对于每个i(1<i<n),判断ai-1,ai,ai+1是否为等差数列,是否为等比数列,就能扫一遍求出最长的等差数列和最长的等比数列,复杂度O(n),模拟即可:
代码:
#pragma comment(linker, "/STACK:1024000000,1024000000") #include <cctype> #include <cerrno> #include <cfloat> #include <ciso646> #include <climits> #include <clocale> #include <cmath> #include <csetjmp> #include <csignal> #include <cstdarg> #include <cstddef> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> // C++ #include <algorithm> #include <bitset> #include <complex> #include <deque> #include <exception> #include <fstream> #include <functional> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include <istream> #include <iterator> #include <limits> #include <list> #include <locale> #include <map> #include <memory> #include <new> #include <numeric> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stack> #include <stdexcept> #include <streambuf> #include <string> #include <typeinfo> #include <utility> #include <valarray> #include <vector> using namespace std; #define rep(i,j,k) for(int i=(int)j;i<(int)k;++i) #define per(i,j,k) for(int i=(int)j;i>(int)k;--i) #define lowbit(a) a&-a #define Max(a,b) a>b?a:b #define Min(a,b) a>b?b:a #define mem(a,b) memset(a,b,sizeof(a)) typedef long long LL; typedef unsigned long long LLU; typedef double db; const int N=1e5; const int inf=0x3f3f3f3f; int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}}; int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}}; int movv[5][2]= {{1,0},{0,1},{0,0},{-1,0},{0,-1}}; inline LL read() { int c=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { c=c*10+ch-'0'; ch=getchar(); } return c*f; } __int64 t,n,m,x,y,a,b,c,d,h1,h2; __int64 res; int main() { scanf("%I64d",&t); while(t--) { scanf("%I64d",&n); if(n==1) { scanf("%I64d",&x); puts("1"); } else { /// 1 2 3 4 6 12 scanf("%I64d%I64d",&x,&y);/// 1 2 h1=h2=2; __int64 fx=x,fy=y; __int64 dc=y-x; __int64 db=y/x; res=2; for(int i=3; i<=n; ++i){ x=y; scanf("%I64d",&y);/// 3 4 if(y-x==dc)///等差数列 h1++; else{ h1=2; dc=y-x; } if(y*fx==x*fy){///等比数列 h2++; } else{ h2=2; fx=x,fy=y; } res=max(res,max(h1,h2)); } printf("%I64d\n",res); } } return 0; }
hdu 5327 Olympiad
统计一个区间内“美丽 的数的个数”:定义美丽 的数:每一位数字互不相同
【思路】:set的自动去重,判断+前缀和即可
代码:
#include <bits/stdc++.h> using namespace std; const int N=1e6+10; int num[N]; int t,n,m; bool check(int x) { set<int > s; while(x) { int y=x%10; if(!s.count(y)) s.insert(y); else return false; x/=10; } return true; } int main() { num[0]=0; for(int i=1; i<=N; ++i) num[i]=check(i)?1:0; for(int i=2; i<=N; ++i) num[i]+=num[i-1]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); printf("%d\n",num[m]-num[n-1]); } return 0; }