ACM实验室2020.10.03 天梯赛二

7-2 是不是太胖了 (5分)

题意:pass

做法:pass

代码:pass

7-3 N个数求和 (20分)

题意:就是求分数的和,顺便还不能有假分数

做法:这题一开始用很笨很笨的办法做的,代码也放出来了(第一个),但是有两个点答案错误,也不知道怎么错误了,之后参考了网上人家的代码,发现人家是先从第一个分数入手之后通分?(应该是),之后再进行运算,改成人家的这样之后就对了

代码:

//去吧马里奥!把AC公主救回来!
//        ********
//       ************
//       ####....#.
//     #..###.....##....
//     ###.......######
//        ...........
//       ##*#######
//    ####*******######
//   ...#***.****.*###....
//   ....**********##.....
//   ....****    *****....
//     ####        ####
//   ######        ######
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
#include<vector>
#include<iomanip>
#include<queue>
#include<set>
#define LL long long
#define _64 __int64
const double PI = atan(1.)*4.;
using namespace std;

LL zi[200];
char fei[200];
LL mu[200];

LL GCD(LL a,LL b){
    if(a == 0)return 0;
        else
    return (b == 0) ? a : GCD(b, a % b);
}

int main(){
    int N;
    cin >> N;
    LL x,a,b,c,d;
    scanf("%lld/%lld",&a,&b);
    int gcdn;
    gcdn = GCD(a,b);
    int t = GCD(a,b);
    if(a){
        a = a / t;
        b = b / t;
    }
    int i = 1;
    while(i < N){
        scanf("%lld/%lld",&c,&d);
        x = b / GCD(b,d) * d;
        a = a * x/b + c * x/d;
        b = x;
        int t = GCD(a,b);
        if(t != 0){
            a = a / t;
            b = b / t;

        }
        i++;
    }
    if(a != 0 && a / b == 0){
        cout << a%b << "/" << b << endl;
    }else if(a % b == 0){
        cout << a / b << endl;
    }else{
        cout << a/b << " " << a%b << "/" << b << endl;
    }
}

7-4 求整数段和 (10分)

题意:输出A和B之间的数,最后再求个和

做法:这题主要问题就是控制格式,问题不大问题不大

代码:

//去吧马里奥!把AC公主救回来!
//        ********
//       ************
//       ####....#.
//     #..###.....##....
//     ###.......######
//        ...........
//       ##*#######
//    ####*******######
//   ...#***.****.*###....
//   ....**********##.....
//   ....****    *****....
//     ####        ####
//   ######        ######
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
#include<vector>
#include<iomanip>
#include<queue>
#include<set>
#define LL long long
#define _64 __int64
const double PI = atan(1.)*4.;
using namespace std;

int main(){
    int a,b;
    cin >> a >> b;
    int i = a;
    int coun = 0;
    int sum = 0;
    while(i <= b){
        int countn = 0;

        printf("%5d",i+countn);
        sum += i+countn;
        countn++;
        i++;
        coun++;
        if(coun == 5){
            coun = 0;
            cout << endl;
        }
    }
    if((b-a+1)%5 == 0){
        cout <<"Sum = "<< sum << endl;
    }else{
        cout << endl;
        cout <<"Sum = "<< sum << endl;
    }


}

7-5 6翻了 (15分)

题意:把满足要求的3替换成6、9或者27

做法:一个一个的统计6的个数,一旦6的个数满足要求就进行替换,如此一直往下读就行

代码:

//去吧马里奥!把AC公主救回来!
//        ********
//       ************
//       ####....#.
//     #..###.....##....
//     ###.......######
//        ...........
//       ##*#######
//    ####*******######
//   ...#***.****.*###....
//   ....**********##.....
//   ....****    *****....
//     ####        ####
//   ######        ######
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
#include<vector>
#include<iomanip>
#include<queue>
#include<set>
#define LL long long
#define _64 __int64
const double PI = atan(1.)*4.;
using namespace std;

int main(){
    string s;
    getline(cin,s);
    int num  = 0;
    for(int i = 0;i < s.length();i++){
        if(s[i] == '6'){
            num++;
if(s.length()-1 == i){if(num > 9){
                cout << "27";
            }else if(num <=9 && num >3){
                cout << "9";
            }else {
                while(num--){
                    cout << "6";
                }
            }}
        }else{
            if(num > 9){
                cout << "27";
            }else if(num <=9 && num >3){
                cout << "9";
            }else {
                while(num--){
                    cout << "6";
                }
            }

            num = 0;
            cout << s[i] ;
        }


    }
}

7-6 一帮一 (15分)

题意:将从前数的人和从后数的人放到一起,而且必须男女一对(满脸问号)

做法:用一个vis数组记录当前这个人有没有被分配,用两个数组储存性别和名字,从头从尾循环判断就行

代码:

//去吧马里奥!把AC公主救回来!
//        ********
//       ************
//       ####....#.
//     #..###.....##....
//     ###.......######
//        ...........
//       ##*#######
//    ####*******######
//   ...#***.****.*###....
//   ....**********##.....
//   ....****    *****....
//     ####        ####
//   ######        ######
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
#include<vector>
#include<iomanip>
#include<queue>
#include<set>
#define LL long long
#define _64 __int64
const double PI = atan(1.)*4.;
using namespace std;

int a[100];
string s[100];
int vis[100];

int main(){
    int N;
    cin >> N;
    for(int i = 1;i <= N;i++){
        cin >> a[i] >> s[i];

    }
    for(int i = 0;i < 100;i++)vis[i] = 0;

    for(int j = 1;j <= N;j++){
        if(vis[j] == 0){
            cout << s[j] << ' ';
            vis[j] = 1;
            for(int i = N;i >=1;i--){
                if(vis[i] == 0 && a[j] != a[i]){
                    cout << s[i] <<endl;
                    vis[i] = 1;
                    break;
                }
            }
        }
    }

}

7-7 到底是不是太胖了 (10分)

做法:和上面那个差不多,就是多个判断

代码:

//去吧马里奥!把AC公主救回来!
//        ********
//       ************
//       ####....#.
//     #..###.....##....
//     ###.......######
//        ...........
//       ##*#######
//    ####*******######
//   ...#***.****.*###....
//   ....**********##.....
//   ....****    *****....
//     ####        ####
//   ######        ######
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
#include<vector>
#include<iomanip>
#include<queue>
#include<set>
#define LL long long
#define _64 __int64
const double PI = atan(1.)*4.;
using namespace std;

int main(){
    int N;
    cin >> N;
    while(N--){

        double h;
        double w;
        double bw;
        cin >> h >> w;
        bw = (h-100)*0.9;
        bw = bw*2;
        double ans;
        ans = fabs(w-bw);
        double num;
        num = bw *0.1;
        if(ans < num){
            cout << "You are wan mei!" << endl;
        }else if(w < bw){
            cout << "You are tai shou le!" << endl;
        }else if(w > bw){
            cout << "You are tai pang le!" << endl;
        }
    }
}

7-8 简单题 (5分)

做法:没错,是挺简单的

7-9 名人堂与代金券 (25分)

做法:这里得考虑用一个结构体来储存成绩和邮箱,再然后最要命的问题就是排序输出的问题了,首先排序得自定义一下,有限按照成绩排,如果成绩一样就按找邮箱(字符串)排

代码:

//去吧马里奥!把AC公主救回来!
//        ********
//       ************
//       ####....#.
//     #..###.....##....
//     ###.......######
//        ...........
//       ##*#######
//    ####*******######
//   ...#***.****.*###....
//   ....**********##.....
//   ....****    *****....
//     ####        ####
//   ######        ######
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
#include<vector>
#include<iomanip>
#include<queue>
#include<set>
#define LL long long
#define _64 __int64
const double PI = atan(1.)*4.;
using namespace std;

struct data{
    int grade;
    string mail;
}x[20005];

//string s[20005];
//int g[20005];

bool cm(data a,data b){
    if(a.grade != b.grade){
        return a.grade > b.grade;
    }else{
        return a.mail < b.mail;
    }
}

int main(){
    int N,G,K;
    cin >> N >> G >> K;
    for(int i = 0;i < N;i++){
        cin >> x[i].mail >> x[i].grade;
    }
    int jin_sum = 0;
    for(int i = 0;i <N;i++){
        if(x[i].grade >= G && x[i].grade <= 100){
            jin_sum += 50;
        }else if(x[i].grade >= 60 && x[i].grade < G){
            jin_sum += 20;
        }
    }
    sort(x,x+N,cm);

    cout << jin_sum << endl;
    int countn = 0;
    for(int i = 0;i <N;i++){
        if(i == 0){
            countn = i+1;
        }else if(x[i].grade != x[i-1].grade){
            countn =1+i;
        }
        if(countn >K){
            break;
        }
        cout << countn << " " << x[i].mail << " " << x[i].grade << endl;
    }


}

7-12 月饼 (25分)

题意:求最大利润,本质上求的是单位库存重量的价值

做法:用一个结构体储存库存容量和总价,再用一个数组储存所有的单位价值(比如第一种有5库存,第二种有10库存,那就要存15种单位价值),之后写个条件降序排序,从大到小把大的加起来,输出即可

代码:

//去吧马里奥!把AC公主救回来!
//        ********
//       ************
//       ####....#.
//     #..###.....##....
//     ###.......######
//        ...........
//       ##*#######
//    ####*******######
//   ...#***.****.*###....
//   ....**********##.....
//   ....****    *****....
//     ####        ####
//   ######        ######
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
#include<vector>
#include<iomanip>
#include<queue>
#include<set>
#define LL long long
#define _64 __int64
const double PI = atan(1.)*4.;
using namespace std;

bool cmp(double a,double b){
    return a > b;
}
struct x{
    double kucun;
    double zongjia;
}num[200005];

int main(){
    int n,d;
    cin >> n >> d;
    for(int i = 0;i < n;i++){
        cin >> num[i].kucun;
    }
    for(int i = 0;i < n;i++){
        cin >> num[i].zongjia;

    }
    int cnt = 0;
    double price[200000];
    for(int i = 0;i < n;i++){
        for(int j = 0;j < num[i].kucun;j++){
            price[cnt] = num[i].zongjia  / num[i].kucun;
            cnt++;
        }
    }
    double sum = 0;
    sort(price,price+cnt,cmp);
    for(int i = 0;i < d;i++){
        sum += price[i];
    }
    printf("%.2f",sum);
}

 

posted @ 2020-10-18 21:39  CCCCrack  阅读(112)  评论(0)    收藏  举报