2017.10.17 模拟赛

题目链接

  T1

  统计前缀和 以及 后缀的0的数量

  答案显然就是min{当前位置1的个数+当前位置后的零的个数}

  加个特判  当全都是0或1时 输出0

#include <cstring>
#include <cstdio>
#define N 100005
char str[N];
int ans,len,a[N],sum0[N],sum1[N];
inline int min(int a,int b) {return a>b?b:a;}
int main(int argc,char *argv[])
{
    freopen("reverse.in","r",stdin);
    freopen("reverse.out","w",stdout);
    scanf("%s",str);
    ans=len=strlen(str);
    for(int i=0;i<len;++i) a[i+1]=str[i]-'0',sum1[i+1]=sum1[i]+a[i+1];
    for(int i=len;i>=1;--i) sum0[i]=sum0[i+1]+(a[i]==0?1:0);
    if(sum0[1]==0||sum1[len]==0) {printf("0");return 0;} 
    for(int i=1;i<=len;++i) ans=min(ans,sum1[i]+sum0[i+1]);
    printf("%d\n",ans);
    fclose(stdin); fclose(stdout);
    return 0;
}
View Code

  T2

  hash

  若x,y的数码种类相同 则这个哈希值也相同 

  一个哈希值的个数为C(sum,2);

  本来T成  加了register快的飞起

 

#include <iostream>
#include <cstdio>
#define N 1024
using namespace std;
int n,cnt[N],pow2[10]={1,2,4,8,16,32,64,128,256,512};
long long ans;
bool exist[10];
int Main()
{
    freopen("number.in","r",stdin);
    freopen("number.out","w",stdout);
    cin>>n;
    for(register int i=1;i<=n;++i)
    {
        register int x=i,sum=0;
        while(x)
        {
            exist[x%10]=true;
            x/=10;
        }
        for(register int j=0;j<=9;++j) {if(exist[j]) sum+=pow2[j];exist[j]=false;} 
        cnt[sum]++;
    }
    for(int i=0;i<N;++i) ans+=1ll*cnt[i]*(cnt[i]-1)/2;
    cout<<ans<<endl;
    fclose(stdin); fclose(stdout);
    return 0;
}
int sb=Main();
int main(int argc,char *argv[]) {;}
View Code

  T3

  贪心 使偶数项上的数尽量大,使奇数项上的数尽量小

 

#include <cstdio>
#include <cctype>
#define N 2000005

bool found;
int n,k,flag,a[N],ls[N];
inline void read(int &x)
{
    bool f=0;register char ch=getchar();
    for(x=0;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
    for(;isdigit(ch);x=x*10+ch-'0',ch=getchar());
    x=f?-x:x;
}
void alalbbalbbsgkldqn()
{
    puts("hello ladies and gentlemen");
    puts("i'm MC bytlxmdsyl");
    puts("有一本书名叫天方夜谭");
    puts("很奇妙又好看");
    puts("叙述的是阿拉伯的故事");
    puts("到处都在流传");
    puts("由阿拉丁神灯");
    puts("有辛巴达航海");
    puts("one two three and four");
    puts("come on yo let's go");
    puts("这里有个神奇的故事");
    puts("一个人 一个人");
    puts("一个人的命运会改变");
    puts("阿里 阿里巴巴");
    puts("阿里巴巴是个快乐的青年");
    puts("阿里 阿里巴巴");
    puts("阿里巴巴是个快乐的青年");
}
int main(int argc,char *argv[])
{
    freopen("wave.in","r",stdin);
    freopen("wave.out","w",stdout);
    read(n);read(k);
    for(int i=1;i<=n;++i) read(a[i]);
    printf("%d\n",((n^(2^2^n&(1&1)))-((n^1)-((n+1)^1))+1)>>1);
    fclose(stdin);
    fclose(stdout);
    return 0;
    alalbbalbbsgkldqn();
}
考场10分代码
#include<iostream>
#include<cstdio>
#include<cstring>

#define N 2000007

using namespace std;
int a[N];
int n,k,m,ans,cur;

inline int read()
{
    int x=0,f=1;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

int main()
{
    n=read();k=read();
    for(int i=0;i<n;i++) a[i]=read();
    ans=1,m=0,cur=a[0];
    for(int i=1;i<n;i++)
    {
        if(m)
          if(cur-a[i]>=k)
            m=0,ans++,cur=a[i];
          else cur=max(cur,a[i]);
          
        else
          if(a[i]-cur>=k)
            m=1,ans++,cur=a[i];
          else cur=min(cur,a[i]);
    }
    printf("%d\n",ans);
    return 0;
}
View Code

 

posted @ 2017-10-17 15:01  杀猪状元  阅读(233)  评论(0编辑  收藏  举报