考虑到第四场题目难度过大,加了两道水题
结果就只做出这两道水题
Hdu 5327 Olympiad
链接
Olympiad
题意
统计区间[a,b]内满足各位数字不同的数的个数
分析
多区间查询,若每次都计算个数效率非常低,可以预处理,先标记[1,100000]内每个数是否满足条件,再用s[i]累计区间[1,i]的满足条件的总个数
计算[a,b]的个数,只需用s[b]-s[a-1]即可
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include<stdio.h> const int N=100000; int s[N+10]; void init() { for(int i=1;i<=N;i++){ bool flag[10]={false}; int t=i; while(t){ if(flag[t%10]) break; flag[t%10]=true; t/=10; } s[i]=s[i-1]; if(!t) s[i]++; } } int main() { init(); int T; scanf("%d",&T); while(T--){ int l,r; scanf("%d%d",&l,&r); printf("%d\n",s[r]-s[l-1]); } return 0; }
|
Hdu 5328 Problem Killer
链接
Problem Killer
题意
给定长度为n的数列,求最长的区间[l,r]满足
区间[l,r]形成的数列必须为等差数列或者等比数列
分析
等差数列公差相等,等比数列公比相等
可以求出原数列所有相邻两项的差和比,
然后求最长的连续相等序列的长度
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include<stdio.h> #define max(a,b) a>b?a:b const int N=1000000; int n; double a[N+10],b[N+10],c[N+10]; int solve(double x[]) { int l=1,cnt=0; while(l<n){ int r=l; while(r<n&&x[r]==x[l]) r++; cnt=max(cnt,r-l); l=r; } return cnt; } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf",&a[i]); for(int i=1;i<n;i++){ b[i]=a[i+1]-a[i]; c[i]=a[i+1]/a[i]; } int ans=0; ans=max(ans,solve(b)); ans=max(ans,solve(c)); printf("%d\n",ans+1); } return 0; }
|