ACM 实验室2020.10.10天梯赛练习*2

7-1 估值一亿的AI核心代码 (20分)
输出都对但是没过
 
#include<bits/stdc++.h>
#define ll long long
//#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int main()
{
    //speed_up;
    int n;
    cin>>n;
    vector<string>v;
    getchar();//不要忘了
    while(n--)
    {
        string s="";
        getline(cin,s);
        cout<<s<<endl<<"AI:";
        //替换大写字母 除了I都变小写,替换'?'
        for(int i=0; i<s.size(); i++)
        {
            if(s[i]>='A'&&s[i]<='Z')//按照ascii码值分类
            {
                if(s[i]!='I')
                    s[i]+=32;
            }
            else if(s[i]=='?')
                s[i]='!';
            else if((s[i]>='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z'))
                continue;
            else if(s[i]!=' ')//剩下的全为标点符号,标点的前面要加个空格
                //否则会出现"I,don"这种连在一起的情况
            {
                s.insert(i," ");//插入函数
                //s.insert(i+2," ");
                i++;
            }
        }
        int j=0;
        string vv="";//存数组
        for(int i=0; i<s.size(); i++)
        {
            if(s[i]!=' ')
                vv+=s[i];
            if((i==s.size()-1||s[i]==' ')&&vv!="")
            {
                v.push_back(vv);
                j++;
                vv="";
            }
        }
        for(int i=0; i<j; i++)
        {
            if(v[i]=="I"||v[i]=="me")
                v[i]="you";
        }
        for(int i=1; i<j; i++)
        {
            if(v[i-1]=="can"&&v[i]=="you")
            {
                v[i-1]="I";
                v[i]="can";
            }
            if(v[i-1]=="could"&&v[i]=="you")
            {
                v[i-1]="I";
                v[i]="could";
            }
        }
        /*for(int i=0;i<j;i++)
        {
            cout<<v[i]<<endl;
        }*/
        vv="";
        for(int i=0; i<j; i++)
        {
            vv=v[i];
            if((vv[0]>='0'&&vv[0]<='9')||(vv[0]>='a'&&vv[0]<='z')||vv[0]=='!'||vv[0]=='I')
            {//不是标点
                cout<<" "<<v[i];
            }
            else//是标点(标点前面不输出空格)
            {
                if(i==0)cout<<" ";
                cout<<v[i];
            }
        }
        cout<<endl;
        v.clear();
    }
}
7-3 N个数求和 (20分)
这个题因为输入写错了一直浮点错误,输入用了scanf("%d/%d",&a,&b);
应该定义一个char //char cc,c2;然后分开输入//cin>>w>>cc>>s;
 
7-5 6翻了 (15分)

输入格式:

输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。

输出格式:

从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。

比赛时输入的方式不对,直接把每个单词存入string数组里了,这样最后一个字符如果是空格就输出不了了,而且没有考虑到可能出现一个单词同时有字符和数字6的情况,当出现这种情况时没有输出字符

string s[1000];
    int i=0;
    while(cin>>s[i])
    {
        if(cin.get()=='\n')break;
        i++;
    }
    for(int j=0;j<=i;j++)
    {
        int m=0;
        for(int k=0;k<s[j].length();k++)
        {
            if(s[j][k]=='6')m++;
        }
        if(m>3&&m<=9)cout<<"9";
        else if(m>9)cout<<"27";
        else cout<<s[j];
        if(j!=i)cout<<" ";
    }
    cout<<endl;//错误代码,不能这样输入

#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
ll gcd(ll a,ll b)//
{
    return b?gcd(b,a%b):a;
}
/*
*/
int main()
{
    speed_up;
    string s;
    getline(cin,s);//输入带空格的字符串
    int x=0;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='6')
        {
            x++;
            if(i==s.size()-1)//当遍历到最后一位时的特殊情况
            {
                if(x>9)cout<<"27"; //当x超过9
                if(x>3&&x<=9)cout<<"9";
                if(x>0&&x<=3)//三个以下的6直接原样输出
                {
                    while(x--)cout<<"6";
                }
            }
        }
        else//当下一位不是6时
        {
            if(x>9)cout<<"27";
            if(x>3&&x<=9)cout<<"9";
            if(x>0&&x<=3)
            {
                while(x--)cout<<"6";
            }
            x=0;
            cout<<s[i];//输出这一位字符
        }
    }
    cout<<endl;
}

7-9 名人堂与代金券 (25分)
没来得及做
关于结构体排序
struct data
{
    string s;//名字
    int a;//成绩
}d[100000];
bool cmp(data x,data y)
{
    if(x.a!=y.a)
        return x.a>y.a;//成绩不相同,按从大到小排序
    return x.s<y.s;//成绩相同,按名字首字母升序排序
}
7-11 部落 (25分)
这个题用并查集算法,刚开始不会,学到了学到了
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int f[100001];
set<int>s;//set集合记录人数
int find(int x)//并查集,把同一个部落的人标记为同一个数
{
    if(x!=f[x])return f[x]=find(f[x]);
    return x;
}
int main()
{
    speed_up;
    for(int i=1;i<=10000;i++)f[i]=i;
    int t;
    cin>>t;
    while(t--)
    {
        int n,mm,m;
        cin>>n;
        cin>>mm;
        s.insert(mm);
        for(int i=1;i<n;i++)//把每一行的数标记为输入的第一个数的值
        {
            cin>>m;
            s.insert(m);
            f[find(m)]=mm;
        }
    }
    cout<<s.size();//总人数
    set<int>s2;
    set<int>::iterator it;
    for(it=s.begin();it!=s.end();it++)//再用一次find把编号等于下标的数统一为这个下标对应的编号
    {
        s2.insert(find(*it));//此时一个编号代表一个部落,相同编号的在同一个部落里
    }
    cout<<" "<<s2.size()<<endl;//部落个数
    int l;
    cin>>l;
    for(int i=0;i<l;i++)
    {
        int a,b;
        cin>>a>>b;
        if(find(a)==find(b))
        {
            cout<<"Y"<<endl;
        }
        else cout<<"N"<<endl;
    }
}

7-12 月饼 (25分)

没来得及做,补题的时候因为有一个地方多减了一遍没得全分

#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
struct cake
{
    double sum;//库存量
    double m;//总售价
    double di;//总售价/库存量
}c[100010];
bool cmp(cake x,cake y)
{
    return x.di>y.di;
}
int main()
{
    speed_up;
    int n,d;
    cin>>n>>d;
    for(int i=0;i<n;i++)
    {
        cin>>c[i].sum;
    }
    for(int i=0;i<n;i++)
    {
        cin>>c[i].m;
        c[i].di=c[i].m/c[i].sum*1.0;
        //cout<<b[i]<<endl;
    }
    double x=0;
    sort(c,c+n,cmp);
    //double sum=0;
    for(int i=0;i<n;i++)
    {
        if(d>=c[i].sum)
        {
            d-=c[i].sum;
            x+=c[i].m;
        }
        else
        {
            x+=d*c[i].di;
            break;
        }
        //cout<<c[i].b<<endl;
    }
    printf("%.2f\n",x);
    //cout<<x<<endl;
}

posted @ 2020-10-18 19:24  SyrupWRLD  阅读(117)  评论(0)    收藏  举报