CSDN第26期周赛赛后总结(第一次AK)

前言

第一次AK,记录与反思一下。

一、 等差数列

1、题目描述

一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)的数列。在这个问题中a是一个非负的整数,b是正整数。 现给出三个整数,分别表示等差数列的第一项a最后一项公差b,求该 数列的和
第一题给出首项,末项,公差,问是否可以构成等差数列,如果可以,输出从首项到末项的和,否则输出-1

2、思路分析

如果可以构成等差,则说明首项和末项之间相差整数倍公差,所以据此来判断是否为等差数列,而数列和可以利用等差数列求和公式(首项+末项)*公差/2求得。

3、代码详解

#include <iostream>
using namespace std;
long long a,b,la;
int main(){
    cin>>a>>la>>b;
    int t=la-a;
    if(t%b==0){
    cout<<(a+la)*(t/b+1)/2;
    }
    else{
    cout<<-1;
    }
    return 0;
}

二、阿波罗的魔力宝石

1、题目描述

在希腊神话中,有一个神祗阿波罗。阿波罗拥有一枚能够使人变得更加聪明的神奇宝石。但是,这枚宝石的魔力被封印在 了一个混乱的顺序中,你需要通过排序的方法才能拥有这枚宝石的魔力。 给定一个长度为 N 整数数组 A,请你将数组 A中的元素进行 冒泡排序。(该题目由CSDN用户【生产队的刘同学】提供)。

2、思路分析

直接无脑sort()了,输出排序序列即可。

3、代码详解

#include <iostream>
#include <algorithm>
using namespace std;
const int N=100010;
int n,a[N];
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    for(int i=0;i<n;i++){
        cout<<a[i]<<endl;
    }
   return 0;
}

三、任务分配问题

1、题目描述

小明手头上有n个问题,每个问题都有一个数值,表示这个问题的难度;正好小明团队有n个人,每个人都有一个数值,表示这个人的能力 现在小明要把这 n个问题分配给每个人,要求 能力更高的人分配到更高难度的问题

2、思路分析

这道题是解题时间是最长的,办法也不是很好,但是过了。
方法:先将问题难度的序列从大到小排序,然后将输入的人和他们的编号存在了pair数组中(first存第几个人,second存能力大小),然后根据能力从大到小排序,如果能力相同,按first排序(均需要手写cmp函数)。然后依次遍历每个人,此时pair数组中能力是从大到小,而且如果能力相同也是按照输入顺序排的,所以此时依次将问题难度从大到小分配给他们即可,将每个人处理问题的难度,存入每个人的second中,最后再按每个人的first排序,最后按顺序输出每个人的second即可。

3、代码详解

#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
const int N=100010;
int n,d[N];
PII p[N];
int cmpd(int A,int B){
    return A>B;
}
int cmpp(PII A,PII B){
    if(A.second==B.second){
       return A.first<B.first;
}
     return A.second>B.second;
}
int cmmp(PII A,PII B){
    return A.first<B.first;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>d[i];
     }
    sort(d+1,d+n+1,cmpd);
    for(int i=1;i<=n;i++){
        p[i].first=i;
        cin>>p[i].second;
    }
    sort(p+1,p+n+1,cmpp);
    for(int i=1;i<=n;i++){
        p[i].second=d[i];
     }
     sort(p+1,p+n+1,cmmp);
     for(int i=1;i<=n;i++){
         cout<<p[i].second<<endl;
      }
     return 0;
}

四、单词逆序

1、题目描述

对于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整,也就是说,字符串由一些由空格分隔的部分组成,你需要将这些部分逆序。 给定一个原字符串A,请返回 逆序后的字符串
例:
输入:I love you
输出:you love I

2、思路分析

输入用getline(),直接输入string变量,不接收空格。
方法:如果遇到空格就截取上一个空格到当前空格之间的字符串(需要有个变量来记录上一个空格的位置,初始化此变量为0),然后放进栈中。这时最后的一部分字符串没有放进栈中,需要单独操作。然后依次弹出,即是结果。

3、代码详解

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
const int N=10010;
string s,tmp;
stack<string> stk;
int k;
int main(){
    getline(cin,s);
    int ls=s.size();
    for(int i=0;i<ls;i++){
       if(s[i]==' '){
       tmp=s.substr(k,i-k);
       stk.push(tmp);
       k=i+1;
     }
    }
    tmp=s.substr(k,ls-k);
    stk.push(tmp);
    while(!stk.empty()){
         cout<<stk.top()<<' ';
         stk.pop();
    }
    return 0;
}

总结

对于基本输入输出技巧和STL相关操作还不是太熟练,例如getline()pair等相关操作还需要多加练习。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马看到什么是人决定的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值