跳转至

201412第3次

视频题解(暂无)

暂无


第 1 题 门禁系统

题目链接: 门禁系统

TAG: 模拟 STL

思路:

用map或者数组记录数字出现次数即可

代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>
using namespace std;

const int N=1010;

int a[N]; // a[i]表示第i个数出现的次数,初始为0

int main(){
    int n;
    cin>>n;
    while(n--){
        int t;
        cin>>t;
        cout<<++a[t]<<" ";
    }
    return 0;
}

第 2 题 Z 字形扫描

题目链接: Z 字形扫描

TAG: 模拟 循环

思路:

分奇偶分段模拟即可,可以看看注释

代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<bits/stdc++.h>
using namespace std;

const int N=510;

int a[N][N];

int main(){
    int n;
    cin>>n;
    // 读入n行n列的数组
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }
    }
    // 先输出斜着的前n列
    for(int i=1;i<=n;i++){
        if(i&1){ // 列数是奇数的情况
            for(int j=i;j>=1;j--){
                cout<<a[j][i+1-j]<<" ";
            }
        }else{ // 列数是偶数的情况
            for(int j=1;j<=i;j++){
                cout<<a[j][i+1-j]<<" ";
            }
        }
    }
    // 再输出斜着的后n-1列,具体实现类似上面
    for(int i=n+1;i<=2*n-1;i++){
        if(i&1){
            for(int j=n;j>=i-n+1;j--){
                cout<<a[j][i+1-j]<<" ";
            }
        }else{
            for(int j=i-n+1;j<=n;j++){
                cout<<a[j][i+1-j]<<" ";
            }
        }
    }
    return 0;
}

第 3 题 集合竞价

题目链接: 集合竞价

TAG: 大模拟

思路:

按题意进行模拟即可,需要处理的情况稍微复杂一点点,代码注释中有详细解释。

代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include<bits/stdc++.h>
using namespace std;

using ll=long long;
const int N=5010;

// 使用结构体存储每一笔交易的信息
struct Node{
    string type; // 交易类型
    double price; // 交易价格
    int num; // 交易数量
    bool status; // 交易状态,即是否被撤销,true为被撤销
}node[N];

int main(){
    int cnt=1; // 第几行数据
    while(cin>>node[cnt].type>>node[cnt].price){
        if(node[cnt].type=="cancel"){
            node[cnt].status=true; // cancel操作也可以认为是被撤销的交易
            node[(int)node[cnt].price].status=true; // 将相对应的交易撤销
            cnt++;
            continue;
        }
        cin>>node[cnt].num; // 不是撤销操作的话还需要再读入交易数量
        cnt++;
    }
    cnt--; // 由于最后多加了一次cnt,这里需要将其减回来
    ll ans=0; // 记录最终答案的交易量
    double ansp=0; // 记录最终答案的交易价格
    for(int i=1;i<=cnt;i++){ // 对于可能出现的每一种价格进行枚举
        if(node[i].status){ // 如果该交易被撤销直接跳过即可
            continue;
        }
        double tmp=node[i].price; // 记录当前情况下的开盘价
        ll sum1=0,sum2=0; // 分别记录buy和sell的数量
        for(int j=1;j<=cnt;j++){ // 枚举每一笔交易
            if(node[j].status){ // 如果该交易被撤销直接跳过即可
                continue;
            }
            if(node[j].type=="buy"&&node[j].price>=tmp){ // 累加到buy中
                sum1+=node[j].num;
            }else if(node[j].type=="sell"&&node[j].price<=tmp){ // 累加到sell中
                sum2+=node[j].num;
            }
        }
        ll sum=min(sum1,sum2); // 取较小值
        // 更新答案
        if(sum==ans&&tmp>ansp){
            ansp=tmp;
        }else if(sum>ans){
            ans=sum;
            ansp=tmp;
        }
    }
    // 按格式输出,即价格保留2位小数,交易量为整数
    cout<<fixed<<setprecision(2)<<ansp<<setprecision(0)<<" "<<ans;
    return 0;
}

第 4 题 最优灌溉(暂无)

题目链接: 最优灌溉

TAG: 暂无

思路:

暂无

代码:

1
暂无

第 5 题 货物调度(暂无)

题目链接: 货物调度

TAG: 暂无

思路:

暂无

代码:

1
暂无

最后更新: 2022-12-19 10:18:04

评论