HW 12

知道自己究竟想做什么,知道自己究竟能做什么是成功的两大关键

                            —— 比尔盖茨

Problem A: 杯子

题面:

main函数:

int main()
{
    Cup c1;
    int i, j;
    cin>>i>>j;
    Cup c2(i), c3(c2);
    c3.setVolume(j);
    return 0;
}

考点:类的使用

AC代码:

#include <bits/stdc++.h>
using namespace std;
class Cup
{
public:
    int vol;
    Cup(int _v = 0):vol(_v)
    {
        printf("A cup of %d ml is created.\n",vol);
    }
    Cup(const Cup &b):vol(b.vol)
    {
        printf("A cup of %d ml is copied.\n",vol);
    }
    ~Cup()
    {
        printf("A cup of %d ml is erased.\n",vol);
    }
    void setVolume(int _v){vol=_v;}
};

Problem B: QQ好友

题面:

main函数:

int main()
{
    int m, n, i, j, id;
    string str;
    Friends friends;
    cin>>m;
    for (i = 0; i < m; i++)
    {
        cin>>str>>n;
        Group group(str);
        for (j = 0; j < n; j++)
        {
            cin>>id>>str;
            QQ qq(id, str);
            group.addQQ(qq);
        }
        friends.addGroup(group);
    }
 
    cin>>m;
    for (i = 0; i < m; i++)
    {
        cin>>str;
        friends.findGroup(str);
    }
 
    cin>>n;
    for (i = 0; i < n; i++)
    {
        cin>>j;
        friends.findQq(j);
    }
    return 0;
}

考点:类的组合,vector容器的使用,注意,要是对传进来的值进行排序,则该参数不能加const,注意格式控制,有点坑。

AC代码:

#include <algorithm>
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
class QQ
{
public:
    int val;
    string name;
    QQ(int _val,string _name):val(_val),name(_name){}
    bool operator <(const QQ&b)
    {
        return val<b.val;
    }
};
class Group
{
public:
    string n;
    vector<QQ> QQlist;
    Group(string _n):n(_n){}
    void addQQ(const QQ&b)
    {
        QQlist.push_back(b);
    }
};
class Friends
{
public:
    vector<Group> Glist;
    void addGroup( Group&b)
    {
        sort(b.QQlist.begin(),b.QQlist.end());
        Glist.push_back(b);
    }
    void findGroup(string name)
    {
        for(int i = 0;i<Glist.size();i++)
        {
            if(Glist[i].n ==name)
            {
                if(Glist[i].QQlist.size()==0)
                {
                    cout << "Group " << name << " : empty." << endl;
                }
                else
                {
                    cout << "Group " << name << " :";
                    int len = Glist[i].QQlist.size();
                    for(int j= 0;j<len-1;j++)
                    {
                        cout << " " << Glist[i].QQlist[j].val << " " << Glist[i].QQlist[j].name << ";";
                    }
                    cout << " " << Glist[i].QQlist[len-1].val << " " << Glist[i].QQlist[len-1].name << "." << endl;
                }
                return ;
            }
        }
         cout << "Group " << name << " : not existing." << endl;
         return ;
    }
    void findQq(int v)
    {
        //sort(Glist.begin(),Glist.end());
        //bool flag = false;
        int len = Glist.size();
        vector <string> f;
        cout << "QQ " << v << " in :";
        for(int i = 0;i<len;i++)
        {
            int len1 = Glist[i].QQlist.size();
            for(int j = 0;j<len1;j++)
            {
                if(Glist[i].QQlist[j].val==v)
                {
                    f.push_back(Glist[i].n);
                }
            }
        }
        sort(f.begin(),f.end());
        if(f.size()==0)
            cout << " empty." << endl;
        else
        {
            for(int i = 0;i<f.size()-1;i++)
                cout << " " << f[i] << ";";
            cout << " " << f[f.size()-1] << "." << endl;
        }
        return ;
    }
};

Problem C: 玩家PK

题面:

main函数:

int main()
{
    int a, b, c, d;
    string name;
    cin>>name>>a>>b>>c>>d;
    Role one(name, a, b, c, d);
    cin>>name>>a>>b>>c>>d;
    Role two(name, a, b, c, d);
    one.combat(two);
    return 0;
}

考点:小模拟,注意一下当防御最多只能减到0,含有攻击发起者和被攻击者在输出语句的顺序。

AC代码:

#include <bits/stdc++.h>
using namespace std;
class Role
{
public:
    int hp,ce,de,fa;
    string name;
    Role(string _name,int _hp,int _ce,int _de,int _fa):hp(_hp),ce(_ce),de(_de),fa(_fa),name(_name) {}
    void combat(Role &b)
    {
        bool flag = false;
        if(fa>b.fa)
            flag = true;
        while(hp>0&&b.hp>0)
        {
            if(flag)
            {
                if(ce<=b.de)
                {
                    b.hp--;
                }
                else
                    b.hp-=(ce-b.de);
                b.de--;
                if(b.hp<0)
                    b.hp=0;
                if(b.de<0)
                    b.de = 0;
                cout << name << " attacks " << b.name << ":" << b.name;
                printf(" hp=%d,de=%d\n",b.hp,b.de);
            }
            else
            {
                if(b.ce<=de)
                {
                    hp--;
                }
                else
                    hp-=(b.ce-de);
                de--;
                if(hp<0)
                    hp=0;
                if(de<0)
                    de = 0;
                cout << b.name << " attacks " << name << ":" << name;
                printf(" hp=%d,de=%d\n",hp,de);
            }
            flag = !flag;
        }
        if(hp==0)
            cout << b.name << " wins." << endl;
        else
            cout << name << " wins." << endl;
    }
};

Problem D: 时间之差

题面:

main函数:

int main()
{
    int a, b, c;
    cin>>a>>b>>c;
    Time t1(a, b, c);
    cin>>a>>b>>c;
    Time t2(a, b, c);
    cout<<"Deference is "<<(t2 - t1)<<" seconds."<<endl;
    return 0;
}

 

 考点:运算符重载,注意要取秒之差的绝对值

AC代码:

#include <bits/stdc++.h>
using namespace std;
class Time
{
public:
    int h, m, s;
    Time(int _h,int _m,int _s):h(_h),m(_m),s(_s){};
    int operator -(const Time& b)
    {
        int d  = h*3600+m*60+s;
        int d1 = b.h*3600+b.m*60+b.s;
        return abs(d-d1);
    }
};

Problem E: 家禽和家畜

题面:

Main函数:

int main()
{
    Animal *animal;
    char ch;
    while(cin>>ch)
    {
        switch(ch)
        {
        case 'c':
            animal = new Cat();
            break;
        case 'd':
            animal = new Dog();
            break;
        case 'r':
            animal = new Rooster();
            break;
        }
        animal->eat();
        animal->fun();
        delete animal;
    }
    return 0;
}

考点:虚基类的使用,记得写虚析构函数

AC代码:

#include <bits/stdc++.h>
using namespace std;
class Animal
{
public:
    Animal(){};
    virtual void eat()=0;
    virtual void fun()=0;
    virtual ~Animal(){};
};
class Cat:public Animal
{
public:
    Cat():Animal(){}
    void eat()
    {
        printf("Cat eats fishes.\n");
    }
    void fun()
    {
        printf("Cat catches mouses.\n");
    }
    ~Cat(){};
};
class Dog:public Animal
{
public:
    Dog():Animal(){};
    void eat()
    {
        printf("Dog eats bones.\n");
    }
    void fun()
    {
        printf("Dog can be housekeeping.\n");
    }
    ~Dog(){};
};
class Rooster:public Animal
{
public:
    Rooster():Animal(){};
    void eat()
    {
        printf("Rooster eats corns.\n");
    }
    void fun()
    {
        printf("Rooster crows.\n");
    }
    ~Rooster(){}
};

Problem F: 复数类模板

题面:

main函数:

int main()
{
    int a, b;
    double c, d;
    cin>>a>>b;
    Complex<int> c1(a, b);
    cout<<setiosflags(ios::fixed)<<setprecision(2)<<c1.getModulus()<<endl;
    cin>>c>>d;
    Complex<double> c2(c, d);
    cout<<setiosflags(ios::fixed)<<setprecision(2)<<c2.getModulus()<<endl;
    return 0;
}

考点:类模板

AC代码:

#include <bits/stdc++.h>
using namespace std;
template<class T>
class Complex
{
public:
    T r,i;
    Complex(T _r,T _i):r(_r),i(_i){}
    double getModulus()
    {
        return sqrt(r*r+i*i);
    }
};

Problem G: 相邻的素数

题面:

main函数:

int main()
{
    int a, b;
    cin>>a>>b;
    Compute compute(a, b);
    compute.showResult();
    return 0;
}

考点:毒瘤题,注意判断一下当要求输出数目大于满足条件素数的数目时,输出应该停止。

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
bool isPrime(LL x)
{
    if(x<=1)
        return false;
    if(x==2)
        return true;
    for(LL i= 2; i*i<=x; i++)
    {
        if(x%i==0)
            return false;
    }
    return true;
}
class Compute
{
 
public:
    int m,n;
    Compute(int _m,int _n):m(_m),n(_n) {};
    void showResult()
    {
        if(n>0)
        {
            LL num = m;
            int k = 0;
            while(k<n)
            {
                if(isPrime(num))
                {
                    if(k==0)
                        cout << num ;
                    else
                        cout << " " << num;
                    k++;
                }
                num++;
            }
        }
        else if(n<0)
        {
            n = abs(n);
            LL num = m;
            int k = 0;
            while(k<n&&num>1)
            {
                if(isPrime(num))
                {
                    if(k==0)
                        cout << num ;
                    else
                        cout << " " << num;
                    k++;
                }
                num--;
            }
        }
        cout << endl;
    }
};

Problem H: 数组的平滑

题面:

考点:vector的使用,以及负数的四舍五入等于其绝对值四舍五入结果取负。

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
vector<LL> vec,vec1;
LL check = 0;
void op()
{
    for(int i = 1;i<vec.size()-1;i++)
    {
        LL num = vec[i-1]+vec[i+1];
        LL n = abs(num);
        if(num<0)
            vec[i] = -(n+1)/2;
        else
            vec[i] = (n+1)/2;
    }
    while(vec1!=vec)
    {
        vec1 = vec;
         for(int i = 1;i<vec.size()-1;i++)
    {
        LL num = vec[i-1]+vec[i+1];
        LL n = abs(num);
        if(num<0)
            vec[i] = -(n+1)/2;
        else
            vec[i] = (n+1)/2;
    }
 
    }
    return ;
}
int main()
{
    LL num;
    while(cin >> num)
    {
        vec.push_back(num);
        vec1.push_back(num);
    }
    if(vec.size()<=2&&vec.size()>0)
    {
        cout << vec[0] ;
        for(int i = 1;i<vec.size();i++)
            cout << " " << vec[i];
        cout << endl;
    }
    else if(vec.size()==0)
        return 0;
    else
    {
        check = vec[1];
        op();
        cout << vec[0];
        for(int i = 1;i<vec.size();i++)
            cout << " " << vec[i];
        cout << endl;
    }
    return 0;
}

Problem I: 需要重载吗?

题面:

main函数:

int main()
{
    int i;
    char ch;
    cin>>i>>ch;
    Overload t1, t2(i), t3(ch), t4(i, ch);
    return 0;
}

考点:类的重载。

AC代码:

#include <bits/stdc++.h>
using namespace std;
class Overload
{
public:
    int a;
    char c;
    Overload(){printf("Default constructor is called to make a = 0, c = '0'.\n"); }
    Overload(int i):a(i){printf("First constructor is called to make a = %d, c = '0'.\n",i); }
    Overload(char _c):c(_c){printf("Second constructor is called to make a = 0, c = '%c'.\n",c); }
    Overload(int i,char _c):a(i),c(_c){printf("Third constructor is called to make a = %d, c = '%c'.\n",a,c); }
};

Problem J: 很难的题

题面:

main函数:

int main()
{
    int a;
    cin>>a;
    Difficult difficult(a);
    difficult.show();
    return 0;
}

考点:类的使用

AC代码:

#include <bits/stdc++.h>
using namespace std;
class Difficult
{
public:
    int num;
    Difficult(int _n):num(_n){};
    void show(){printf("%d\n",abs(num)); }
};

Problem K: 数组的归一化

题面:

考点:毒瘤题,全为0时应该全输出1。

AC代码:

#include <bits/stdc++.h>
using namespace std;
vector<int> vec;
int main()
{
    int num = 0;
    double sum = 0;
    while(cin >>num)
    {
        sum+=num;
        vec.push_back(num);
    }
    if(sum==0)
    {
        printf("%.2f",1.00);
        for(int i = 1;i<vec.size();i++)
            printf(" %.2f",1.00);
        printf("\n");
    }
    else
    {
        printf("%.2f",vec[0]/sum);
        for(int i =  1;i<vec.size();i++)
            printf(" %.2f",vec[i]/sum);
        printf("\n");
    }
    return 0;
}

 

posted @ 2019-06-27 19:32  浅花迷人  阅读(...)  评论(...编辑  收藏