2020 10 10 天梯赛

5:

我能说这个代码调试了一天吗?

思路:

getline函数输入,然后遍历字符串,记录6出现的次数,如果连续6的次数大于3,将第一个6换成9,然后删除剩下的6,之后更新6的次数、s的长度以及下标i,继续记录6的次数,如果连续6的次数大于9,则将第一个6换成2,第二个6换成7,删除剩余的6,更新数据。

一直WA是因为在更新数据的时候先更新的coun,即6的次数,导致在更新i时出错,因为i的更新是基于coun的。

代码如下:

#include<bits/stdc++.h>

using namespace std;

#define ll long long

int main()

{

    int n,i,j,k;

    string s;

    getline(cin,s);

    int coun=0;

    int start=0;

    int len=s.size();

    if(s[0]=='6')

    {

        start=0;

        coun=1;

    }

    for(i=1; i<len; i++)

    {

        if(s[i]=='6'&&s[i-1]!='6')

        {

            //cout<<"ceshi"<<endl;

            start=i;

            coun++;

            //cout<<"start="<<start<<endl;

        }

        else if(s[i]=='6')

        {

            //cout<<"ceshi"<<endl;

            coun++;

        }

        else if(s[i]!='6')

        {

            //cout<<"ceshi"<<endl;

            //cout<<coun<<endl;

            if(coun>9)

            {

                s[start]='2';

                s[start+1]='7';

                s.erase(start+2,coun-2);

                len-=coun-2;

                i-=coun-1;

                coun=0;

               // i--;

            }

            else if(coun>3)

            {

                //cout<<"i=="<<i<<endl;

                //cout<<"coun="<<coun<<endl;

                //cout<<"ceshi"<<endl;

                s[start]='9';

                s.erase(start+1,coun-1);

                len-=coun-1;

                i-=coun;

                coun=0;

                //cout<<"i="<<i<<endl;

                //cout<<"len-"<<len<<endl;

                //i--;

            }

            coun=0;

        }

    }

    //cout<<i<<endl;

    //cout<<coun<<endl;

    //cout<<len<<endl;

   // cout<<start<<endl;

   // cout<<s<<endl;

    if(coun>9)

    {

        s[start]='2';

        s[start+1]='7';

        s.erase(start+2,coun-2);

        coun=0;

    }

    else if(coun>3)

    {

        //cout<<"ceshi"<<endl;

        s[start]='9';

        s.erase(start+1,coun-1);

        coun=0;

    }

    cout<<s<<endl;

    return 0;

}

6:

水题,纯模拟,代码:

#include<bits/stdc++.h>

using namespace std;

#define ll long long

int main()

{

    int n,i,j,k,a[100],b[100];

    string s[100];

    cin>>n;

    for(i=0;i<n;i++)

    {

        cin>>a[i]>>s[i];

        b[i]=1;

    }

    for(i=0;i<n;i++)

    {

        if(b[i]==1)

        {

            for(j=n-1;j>=0;j--)

            {

                if(b[j]==1&&a[j]!=a[i])

                {

                    cout<<s[i]<<' '<<s[j]<<endl;

                    b[i]=0;

                    b[j]=0;

                    break;

                }

            }

        }

    }

    return 0;

}

7:

模拟,代码如下:

#include<bits/stdc++.h>

using namespace std;

#define ll long long

int main()

{

   int n,i,j,k;

   float h,w;

   cin>>n;

   while(n--)

   {

       cin>>h>>w;

       float standnard=(h-100)*0.9;

       w/=2;

       if(abs(w-standnard)<standnard*0.1)

       {

           cout<<"You are wan mei!"<<endl;

       }

       else if(w>standnard)

       {

           cout<<"You are tai pang le!"<<endl;

       }

       else

       {

           cout<<"You are tai shou le!"<<endl;

       }

   }

    return 0;

}

8:

都是这种题就好了

代码:

#include<bits/stdc++.h>

using namespace std;

#define ll long long

int main()

{

   cout<<"This is a simple problem."<<endl;

    return 0;

}

9:

水题,结构体排序+模拟:

思路:

先存入每一位同学的信息,然后按照题目要求进行结构体排序,最后进行输出。输出的时候需要注意如果这一位同学与上一位同学的分数一样,则排名不需要更新,反之,更新排名至i+i。

代码如下:

#include<bits/stdc++.h>

using namespace std;

#define ll long long

struct student

{

    int score;

    string name;

};

bool cmp(student i,student j)

{

    if(i.score==j.score)

    {

        return i.name<j.name;

    }

    return i.score>j.score;

}

int main()

{

    student stu[10000+8];

    int n,i,j,k;

    string s;

    int g;

    cin>>n>>g>>k;

    int sum=0;

    for(i=0;i<n;i++)

    {

        cin>>stu[i].name>>stu[i].score;

        if(stu[i].score>=60&&stu[i].score<g)

        {

            sum+=20;

        }

        else if(stu[i].score>=g&&stu[i].score<=100)

        {

            sum+=50;

        }

    }

    sort(stu,stu+n,cmp);

    int coun=1;

    cout<<sum<<endl;

    for(i=0;i<k;i++)

    {

            if(i!=0&&stu[i].score==stu[i-1].score)

            {

                ;

            }

            else if(i!=0&&stu[i].score!=stu[i-1].score)

            {

                coun=i+1;

            }

            cout<<coun<<' '<<stu[i].name<<' '<<stu[i].score<<endl;

    }

     while(stu[i].score==stu[i-1].score)

    {

         cout<<coun<<' '<<stu[i].name<<' '<<stu[i].score<<endl;

         i++;

        

    }

    return 0;

}

10:

一个写崩了的模拟题。

思路:

存储链表,然后遍历,没必要在开一个新的链表,直接把删除的元素的下一个地址更改就行了。需要注意的是如果该节点删除,那么上一个节点不会发生变化。

代码如下:
#include<bits/stdc++.h>

using namespace std;

#define ll long long

const int Max=1e5+8;

int start=0;

int head=-2;

int n;

struct lis

{

    int num;

    int next=-1;

};

bool vis[Max];

int main()

{

    lis a[Max];

    int i,j,k,t;

    int xia;

    cin>>start>>n;

    int num=0;

    for(i=0;i<n;i++)

    {

        cin>>k;

        cin>>a[k].num>>a[k].next;

    }

    for(i=start,j=-1;i!=-1;)

    {

        xia=a[i].next;

        int key=abs(a[i].num);

        //cout<<"-----------------"<<i<<endl;

        if(vis[key]==1)

        {

            if(head==-2)

            {

                head=i;

                t=head;

                //a[t].num=a[i].num;

                a[t].next=-1;

            }

            else

            {

                a[t].next=i;

                t=i;

                a[t].next=-1;

                //a[t].num=a[i].num;

            }

            a[j].next=xia;

        }

        else

        {

            //h.insert(abs(a[i].num));

            vis[key]=1;

            j=i;

        }

        i=xia;

    }

    for(i=start;i!=-1;i=a[i].next)

    {

        printf("%05d %d ",i,a[i].num);

        if(a[i].next==-1)

        {

            printf("-1 ");

        }

        else

        {

            printf("%05d ",a[i].next);

        }

    }

    for(i=head;i!=-1;i=a[i].next)

    {

        printf("%05d %d ",i,a[i].num);

        if(a[i].next==-1)

        {

            printf("-1 ");

        }

        else

        {

            printf("%05d ",a[i].next);

        }

    }

    return 0;

}

12题:

模拟,结构体存储月饼的总量、总价格,单价,根据单价结构体排序,模拟,输出结果即可。

代码如下:

#include<bits/stdc++.h>

using namespace std;

#define ll long long

struct moon

{

    float unit,price,num;

};

bool cmp(moon i,moon j)

{

    return i.unit>j.unit;

}

int main()

{

    int n,i,j,k;

    cin>>n;

    float d;

    cin>>d;

    moon cake[2000];

    for(i=0;i<n;i++)

    {

        cin>>cake[i].num;

    }

    for(i=0;i<n;i++)

    {

        cin>>cake[i].price;

        cake[i].unit=cake[i].price/cake[i].num;

    }

    sort(cake,cake+n,cmp);

    float ans=0;

    for(i=0;i<n;i++)

    {

        if(d>=cake[i].num)

        {

            //cout<<cake[i].num<<endl;

            ans+=cake[i].price;

            d-=cake[i].num;

        }

        else

        {

            ans+=d*cake[i].unit;

            break;

        }

    }

    cout<<fixed<<setprecision(2)<<ans<<endl;

    return 0;

}

原文地址:https://www.cnblogs.com/chengxvzhishen/p/13837552.html