2015 Multi-University Training Contest 4

【比赛链接】: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;
}



你可能感兴趣的:(多校训练)