比赛8 总结

来源:互联网 发布:自创麦词软件 编辑:程序博客网 时间:2024/06/08 10:40

  • T1
    • 题面
    • 题意
    • 思路
    • 代码
  • T2
    • 题面
    • 题意
    • 思路
    • 代码
  • T3
    • 题面
    • 题意
    • 错误思路1
    • 超时代码1
    • 错误思路2
    • 超时代码2
    • 正确代码
  • T4
    • 题面
    • 题意
    • 代码
  • T5
    • 题面
    • 题意
    • 思路
    • 代码
  • T6
    • 题面
    • 题意
    • 代码

T1

题面

题意

输入n,k,输出k个数,使这些数的乘积为n

思路

分解质因数,之后统计质数个数,若小于k则输出k,否则将多余数乘起来,再输出

代码

#include<bits/stdc++.h>#define ll long longusing namespace std;ll a[10000005],aa,n,k;void fj(ll n){    ll i;    for(i=2;i<=n;i++)    {        if(n%i==0)        {            aa++;            a[aa]=i;            n=n/i;            i--;        }        if(n==1) return;    }}int main(){    ll i,j,m=1;    cin>>n>>k;    fj(n);    if(aa<k)    {        cout<<-1;        return 0;    }    else    {        for(i=1;i<=aa-k+1;i++)        {            m*=a[i];//多余的数乘起来        }        cout<<m<<" ";        for(i=aa-k+2;i<=aa;i++)        cout<<a[i]<<" ";    }}

T2

题面

题意

输入n和长度为n的整数序列,去掉一些数,使剩下的和最大且为奇数.

思路

将大于0的偶数全部相加,再排序奇数,想加大于0的,统计个数,为奇数则输出答案,反之,比较最小正奇数与最大负奇数,再判断是否都加上.

代码

#include<bits/stdc++.h>#define ll long long#define N 100005using namespace std;ll ji[N],ja,n,k,m,mn=N;int main(){    ll i,j,a,b,ans=0;    cin>>n;    for(i=1;i<=n;i++)    {        cin>>a;        if(a%2==0)        {            if(a>0)            {                ans+=a;            }        }        else        {            ja++;            ji[ja]=a;        }    }    sort(ji+1,ji+ja+1);    if(ji[ja]<0)    {        cout<<ans+ji[ja];        return 0;    }    for(i=ja;i>=1;i--)    {        if(ji[i]>0)        {            ans+=ji[i];            k=1-k;        }        if(ji[i]<0)        {            if(k==1)            {                cout<<ans;                return 0;            }            else            {                if(ji[i]+ji[i+1]>0)                {                    cout<<ans+ji[i];                    return 0;                }                else                {                    cout<<ans-ji[i+1];                    return 0;                }            }        }    }    if(k==1)    cout<<ans;    if(k==0)    {        cout<<ans-ji[1];    }}

T3

题面

题意

输入字符串,有一个栈,通过它(仅可入栈与出栈各一次),输出字典序最小的一种.

错误思路1

每次找出最小的字母,标记并输出.再到着输出未输出的字符串.

超时代码1

#include<bits/stdc++.h>#define ll long long#define N 100005using namespace std;int tou,len,m,n;string y;int zd(int t){    int i,b;    char c=123;    for(i=t;i<=len-1;i++)    {        if(y[i]<c)        {            b=i;            c=y[i];        }    }    return b;}void shch(int b){    int i;    for(i=b;i<len-1;i++)    {        y[i]=y[i+1];    }    len--;}int main(){    string ans;    int i;    ans="";    cin>>y;    tou=0;    len=y.size();    while(tou!=len-1)    {        m=zd(tou);        ans+=y[m];        tou=max(m-1,0);        shch(m);    }    for(i=len-1;i>=0;i--)    ans+=y[i];    cout<<ans;}

错误思路2

统计各个字母的个数,并记录下位置.按字母从小到大输出,并记录最后一位前一个未输出的字母位置,接下来的字母必须在它及其的后面.

超时代码2

#include<bits/stdc++.h>#define ll long long#define N 100005using namespace std;int len,i,j,sl[200],wz[200][10000],tou,pd,k;int main(){    string a;    cin>>a;    len=a.size();    for(i=0;i<=len-1;i++)    {        sl[a[i]]++;        wz[a[i]][sl[a[i]]]=i;    }    for(i='a';i<='z';i++)    {        if(sl[i]>0)        {            pd=0;            for(j=1;j<=sl[i];j++)            {                if(wz[i][j]>=tou)                {                    pd=1;                    printf("%c",i);                    a[wz[i][j]]='0';                }            }            if(pd==1)            {                j=wz[i][sl[i]];                while(a[j]=='0'&&j>0)                {                    j--;                }                tou=j;            }        }    }    for(i=len-1;i>=0;i--)    {        if(a[i]!='0')        {            printf("%c",a[i]);        }    }}

正确代码

暂无

T4

题面

题意

输入一棵二叉树,判断其中的数字是否可以查找到.输出不可以找到的数字个数.

代码

暂无.

T5

题面

题意

输入n和长度为n的整数序列a.输入m,接下来m行输入p,k.输出每组数据p大于n所需的操作次数.
操作:p=p+k+a[p].

思路

先算出k小于等于500时的所有情况,大于500的暴力枚举.

代码

#include<bits/stdc++.h>#define ll long long#define N 100005using namespace std;int a[510][N],b[N],m,n,k;int main(){    int i,j,p,q;    cin>>n;    for(i=1;i<=n;i++)    {        scanf("%d",&b[i]);    }    for(i=1;i<=500;i++)//±íʾq    {        for(j=n;j>=1;j--)//±íʾp        {            if(i+j+b[j]>n)            {                a[i][j]=1;            }            else            {                a[i][j]=a[i][i+j+b[j]]+1;            }        }    }    scanf("%d",&m);    for(i=1;i<=m;i++)    {        scanf("%d%d",&p,&q);        if(q<=500)        {            printf("%d\n",a[q][p]);        }        else        {            k=0;            while(p<=n)            {                k++;                p=p+q+b[p];            }            printf("%d\n",k);        }    }}

T6

题面

题意

有n只老鼠,m个洞,输入老鼠位置,洞的位置和它所能容纳的老鼠个数
输出老鼠进洞的最小距离之和

代码

暂无.