蓝桥杯选拔赛(我是渣渣)

来源:互联网 发布:windows下一个版本 编辑:程序博客网 时间:2024/04/28 12:24

只把开了的题补了

1346: DARK SOULS  

dfs找联通快  注意一个怪也是一群怪

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<queue>using namespace std;priority_queue<int,vector<int>,greater<int> >Q;const int maxn=100+10;bool vis[maxn*maxn];int n,k,d,s,cnt,fb,xx[maxn],yy=0;struct Node{    int x,y,id;}node[maxn*maxn];bool judge(int a,int b,int aa,int bb){   if(fabs(a-aa)<=d&&fabs(b-bb)<=d)  return true;   return false;}void dfs(int cur){    int x=node[cur].x;    int y=node[cur].y;    vis[cur]=true;    for(int i=1;i<=s;i++)    {        if(cur!=i&&!vis[i])        {            int xx=node[i].x;            int yy=node[i].y;            if(judge(x,y,xx,yy))            {                fb++;                dfs(i);            }        }    }}int main(){    int t,ans,sum,l,r;    scanf("%d",&t);    while(t--)    {        sum=ans=0;        scanf("%d%d%d%d",&n,&k,&d,&s);        memset(vis,false,sizeof(vis));        for(int i=1;i<=s;i++)            scanf("%d%d",&node[i].x,&node[i].y);        for(int i=1;i<=s;i++)        {             fb=1;             if(!vis[i])             {                 dfs(i);                 sum+=fb;                 ans++;             }        }        int temp=ans;        ans=(ans/k)+1;        if(temp%k==0) ans--;        printf("%d\n",ans);    }    return 0;}/*12 1 1 41 11 22 12 2*/
1347: GCD

求最大的数在【1,n】中 使gcd(x,n)==1

这个数必然是n-1啊  直接模拟即可。

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;priority_queue<int,vector<int>,greater<int> >Q;  const int maxn=5000+10;  char s[maxn];  int main(){    int t,ok,pd;    scanf("%d",&t);    while(t--)    {        scanf("%s",s+1);        int len=strlen(s+1);        if(s[len]!='0')        {           s[len]=s[len]-1;           printf("%s\n",s+1);        }        else        {            for(int i=len;i>=1;i--)            {                if(s[i]=='0')                    s[i]='9';                else                    {                        s[i]-=1;                        break;                    }            }            if(s[1]=='0')  pd=2;            else   pd=1;            for(int i=pd;i<=len;i++)                printf("%c",s[i]);            printf("\n");        }    }    return 0;}
1349: TLE  用它给的tle的程序打表即可  

会发现直接求前缀和

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;priority_queue<int,vector<int>,greater<int> >Q;  const int maxn=5000+10;  int a[maxn],N,K,pre[maxn];  int main(){    int ans;    while(~scanf("%d%d",&N,&K))    {       ans=0;       for(int i=1;i<=N;i++)            scanf("%d",&a[i]);       pre[0]=0;       for(int i=1;i<=N;i++)          pre[i]=pre[i-1]+a[i];       for(int i=0;i<=N-2;i++)          for(int j=i+2;j<=N;j++)       {            if((pre[j]-pre[i])%K==0)                    ans++;       }       printf("%d\n",ans);    }    return 0;}

1352: 看美女

从做到右,从右到左,扫一遍即可

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;priority_queue<int,vector<int>,greater<int> >Q;  const int maxn=200000+10;bool vis1[maxn],vis2[maxn];int h[maxn],t,n;  int main(){    int le_max,ri_max,ans;    scanf("%d",&t);    while(t--)    {        ans=0;        scanf("%d",&n);        memset(vis1,false,sizeof(vis1));        memset(vis2,false,sizeof(vis2));        for(int i=1;i<=n;i++)            scanf("%d",&h[i]);        le_max=ri_max=-1;        for(int i=1;i<=n;i++)        {            if(h[i]>=le_max)            {                le_max=h[i];                vis1[i]=true;            }        }        for(int i=n;i>=1;i--)        {            if(h[i]>=ri_max)            {                ri_max=h[i];                vis2[i]=true;            }        }        for(int i=1;i<=n;i++)        {            if(vis1[i]||vis2[i])                ans++;        }        printf("%d\n",ans);    }    return 0;}
1355: 巧克力

这题就是我的遗憾之处,哎  搞出来了  结果其中一个函数把push_down写成了push_up,我操 ,自己造的数据也过了

哎,真是不该

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<queue>#include<algorithm>using namespace std;priority_queue<int,vector<int>,greater<int> >Q; const int maxn=1000000+10; int tree[maxn<<2],col[maxn<<2];int n,m; void push_up(int dex){    tree[dex]=max(tree[dex<<1],tree[dex<<1|1]);} void push_down(int dex){    if(col[dex])    {       col[dex<<1]+=col[dex];       col[dex<<1|1]+=col[dex];       tree[dex<<1]+=col[dex];       tree[dex<<1|1]+=col[dex];       col[dex]=0;    }} void buildtree(int dex,int l,int r){    col[dex]=0;    if(l==r)    {        scanf("%d",&tree[dex]);        return;    }    int mid=(l+r)>>1;    buildtree(dex<<1,l,mid);    buildtree(dex<<1|1,mid+1,r);    push_up(dex);} void Update1(int dex,int l,int r,int pos,int val){    if(l==r)    {        tree[dex]=val;        return;    }    push_down(dex);    int mid=(l+r)>>1;    if(pos<=mid)  Update1(dex<<1,l,mid,pos,val);    else          Update1(dex<<1|1,mid+1,r,pos,val);    push_up(dex);} void Update2(int dex,int l,int r,int L,int R){    if(L<=l&&R>=r)    {        col[dex]+=1;        tree[dex]+=1;        return;    }    push_down(dex);    int mid=(l+r)>>1;    if(L<=mid)  Update2(dex<<1,l,mid,L,R);    if(R>mid)   Update2(dex<<1|1,mid+1,r,L,R);    push_up(dex);} int Query(int dex,int l,int r,int L,int R){    if(L<=l&&R>=r)  return tree[dex];    push_down(dex);    int mid=(l+r)>>1;    if(L>mid)        return Query(dex<<1|1,mid+1,r,L,R);    else if(R<=mid)  return Query(dex<<1,l,mid,L,R);    else             return max(Query(dex<<1|1,mid+1,r,L,R),Query(dex<<1,l,mid,L,R));} int main(){    char op[maxn];    int a,b;    while(~scanf("%d%d",&n,&m))    {         buildtree(1,1,n);         for(int i=1;i<=m;i++)         {            scanf("%s",op);            if(strcmp(op,"Query")==0)            {                 scanf("%d%d",&a,&b);                 a++;                 b++;                 int ans=Query(1,1,n,a,b);                 printf("%d\n",ans);            }            else if(strcmp(op,"Ask")==0)            {                 scanf("%d",&a);                 a++;                 int ans=Query(1,1,n,a,a);                 printf("%d\n",ans);            }             else if(strcmp(op,"Change")==0)             {                 scanf("%d%d",&a,&b);                 a++;                 Update1(1,1,n,a,b);             }             else             {                 scanf("%d%d",&a,&b);                 a++;                 b++;                 Update2(1,1,n,a,b);             }         }    }    return 0;}


最后一个kmp,暴力也可过,不贴代码了  

结束了 哎 我太渣了  难过








0 0
原创粉丝点击