CCF/CSP-201412(第3次)

1. 门禁系统

#include<stdio.h>
#define MAXN 1005

int main(){
    int n,d;
    int arr[MAXN] = {0};
    
    scanf("%d",&n);
    while(n--){
        scanf("%d",&d);
        printf("%d ",++arr[d]);
    }
    
    return 0;
}
5 
1 2 1 1 3

1 1 2 3 1

2. Z字形扫描

#include<stdio.h>
#define MAXN 505
int mat[MAXN][MAXN];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&mat[i][j]);
        }
    }
    
    int i=0,j=0;
    int dir=0;    //-1控制右上走,1控制左下走
    while(i>=0 && i<n && j>=0 && j<n){
        printf("%d ",mat[i][j]);    //到达边界时
        if(i==n-1 && j==n-1) break; //超出边界,退出
        if(i==0 && j!=n-1){    //第一行,不是最后一列,向右走一步
            j++;
            dir=1;
            printf("%d ",mat[i][j]);
        }
        else if(j==0 && i!=n-1){ //第一列,不是最后一行,向下走一步
            i++;
            dir=-1;
            printf("%d ",mat[i][j]);
        }
        else if(i==n-1){ //最后一行,不是最后一列,向右走一步
            j++;
            dir=-1;
            printf("%d ",mat[i][j]);
        }
        else if(j==n-1){ //最后一列,不是最后一行,向下走一步
            i++;
            dir=1;
            printf("%d ",mat[i][j]);
        }
        i+=dir; //斜着走,直到到达边界
        j-=dir;
    }
    return 0;
}
4
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3

1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3 

3. 集合竞价

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

struct Record {
    string command;//command
    float  price;//stock price
    long long turnover;//stock turnover
    int flag;//valid record
};

struct Money {
    float price;
    long long bNum,sNum;
};

vector<Record> rec;
vector<Money> mon;


bool cmp(const Record &a,const Record &b) {
    if(a.flag == b.flag && a.flag == 1) {
        return a.price < b.price;
    }
    return a.flag > b.flag;
}

void find(string cmd, float p, long long num) {//Command、price、turnover
    int i;
    Money m;
    
    for(i = 0; i < mon.size(); i++) {
        if(mon[i].price == p) {
            if(cmd == "buy") {
                mon[i].bNum += num;
            } else {
                mon[i].sNum += num;
            }
            break;
        }
    }
    if(i == mon.size()) {
        m.price = p;
        if(cmd == "buy") {
            m.bNum = num;
            m.sNum = 0;
        } else {
            m.sNum = num;
            m.bNum = 0;
        }
        mon.push_back(m);
    }
}

int main() {
    Record r;
    int k;
    
    while(cin >> r.command) {
        if(r.command == "buy" || r.command == "sell") {
            cin >> r.price >> r.turnover;
            r.flag = 1;
        } else if(r.command == "cancel") {
            cin >> k;
            rec[k-1].flag = 0;//第i条记录标记撤销
            r.flag = 0;//该记录标记撤销
        } else  break;
       
        rec.push_back(r);
    }
    
    sort(rec.begin(), rec.end(), cmp);
    
    for(int i = (int)rec.size() - 1; i > -1; i--) {
        if(rec[i].flag == 1) {
            find(rec[i].command, rec[i].price,  rec[i].turnover);
        }
        
    }
    
    long long max = -1;
    float OpeanPrice = mon[0].price;//Opening price
    
    for(int i = 0; i < mon.size(); i++) {
        long long sumb = 0, sums = 0;
        
        for(int j = 0; j <= i; j++)//buyer:from large to small by price
            sumb += mon[j].bNum;
        for(int j = i; j < mon.size(); j++)//seller:from small to large by price
            sums += mon[j].sNum;
        
        long long m = sumb < sums ? sumb : sums;
       
        if(max < m) {
            max = m;
            OpeanPrice = mon[i].price;
        }
    }
    printf("%.2f %lld\n", OpeanPrice, max);
    
    return 0;
}
buy 9.25 100 
buy 8.88 175 
sell 9.00 1000 
buy 9.00 400 
sell 8.92 400 
cancel 1 
buy 100.00 50

9.00 450

4. 最优灌溉

//并查集
#include<iostream>
#include<algorithm>
using namespace std;
const int maxx=100010;
int n,m,ans,tot,father[maxx];
struct node
{
    int u;
    int v;
    int w;
}e[maxx];
int find(int x)
{
    if(x!=father[x])
    father[x]=find(father[x]);
    return father[x];
}
void unionn(int a,int b)
{
    int fa=find(a);
    int fb=find(b);
    father[fa]=fb;
}
bool cmp(const node &a,const node &b)
{
    return a.w<b.w;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    cin>>e[i].u>>e[i].v>>e[i].w;
    for(int i=1;i<=n;i++)
    father[i]=i;
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        if(find(e[i].u)!=find(e[i].v))
        {
            unionn(e[i].u,e[i].v);
            tot++;
            ans+=e[i].w;
        }
        if(tot==n-1)
        break;
    }
    cout<<ans;
    return 0;
}
4 4
1 2 1
2 3 4
2 4 2
3 4 3

6

5. 货物调度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
CSP-S2提高组是中国计算机学会(CCF)主办的一项全国性计算机竞赛,旨在挑选出优秀的高中生并为他们提供提高计算机科学和编程能力的平台。2021年第二轮题解分为以下几个部分。 第一题是关于石头游戏的思考。题目给出了一堆石头的数量,两位玩家轮流选择石头进行取走,每次可以取走1个或者2个石头,最后无法继续取走者输掉游戏。通过观察可以发现,如果一开始给定的石头数量是3的倍数,那么第一个选手必胜;否则,第一个选手无法必胜。这是因为无论第一个选手怎么选取,第二个选手总可以使得每一轮选取后的石头数量保持在3的倍数。因此,只需要判断起始时石头数量是否为3的倍数即可。 第二题是关于好书的购买。题目给出了若干种书的价格和折扣情况,要求在有限的预算下买到尽可能多的书籍。这是一个经典的背包问题。使用动态规划算法可以解决,按照价格从小到大的顺序遍历书籍,设置一个二维数组dp[i][j]表示在前i本书中,花费j的预算能够买到的最多书籍数量。状态转移方程为:dp[i][j]=max(dp[i-1][j], dp[i-1][j-price[i]]+1)。最终的结果即为dp[n][budget],其中n为书籍总数,budget为预算。 第三题是关于均匀生成所有正整数的问题。题目给出了一个区间[L, R],要求输出在该区间内存在的所有正整数。首先通过观察可以发现,对于任意的正整数x,若2x在区间[L, R]内,那么x也在该区间内;若2x+1在区间[L, R]内,那么x也在该区间内。基于这个思路,可以使用递归的方式实现。若L<=R,则输出L,然后递归输出从2*L到R的所有整数。若L>R,则结束递归。 以上就是CSP-S2提高组2021第二轮题解的简要概述。希望这些解题思路对参与竞赛的同学有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值