[Offer收割]编程练习赛104

题目过于简单,没啥好说的,但是拿了个第一感觉很爽,记录一下

 

题目1 : 小Hi与魔法 排序,从1开始递增

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100005;
int a[N];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    sort(a,a+n);
    int ans=0,l=1;
    for(int i=0;i<n;i++)
    {
        if(a[i]==l)
        l++,ans++;
        else if(a[i]==l-1)ans++;
        else break;
    }
    cout<<ans<<"\n";
}

题目2 : 选项编码 就是map一下

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    string s;
    cin>>s;
    unordered_map<string,string>M;
    M["101"]="A";
    M["11"]="B";
    M["0"]="C";
    M["100"]="D";
    string t;
    for(auto X:s)
    {
        t+=X;
        if(M.count(t))
        cout<<M[t],t="";
    }
}

题目3 : 假期旅行 直接dp当前天是不是可以到达,然后分别转移(题目不太好读懂

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1005;
char s[N][N];
int dp[N][N];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>(s[i]+1);
    for(int i=0;i<m;i++)dp[0][i]=1;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    {
        if(dp[i-1][j-1]&&s[i][j]=='O')dp[i][j]=1;
        if(dp[i][j-1]&&s[i][j]=='O')dp[i][j]=1;
    }
    int ans=-1;
    for(int i=1;i<=m;i++)
    if(dp[n][i])
    {
        ans=i;
        break;
    }
    cout<<ans;
}

题目4 : 脉冲星观测 说的是其中有一个多记了,所以只要看前面对,还是后面对就可以了,(当然可以都不对,3的情况)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100005;
int a[N];
set<int>S;
void la(int x)
{
    //cout<<x<<"\n";
    S.insert(1);
    S.insert(x);
    int y=sqrt(x+0.5);
    for(int i=2;i<=y;i++)
    if(x%i==0)S.insert(i),S.insert(x/i);
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    //cout<<a[1]-a[0]<<" "<<a[n-1]-a[n-2]<<"\n";
    if(a[1]-a[0]!=a[n-1]-a[n-2])
    {
        if(a[1]-a[0]!=a[2]-a[1])
        la(a[n-1]-a[n-2]);
        if(a[n-2]-a[n-3]!=a[n-1]-a[n-2])
        la(a[1]-a[0]);
    }
    else la(a[1]-a[0]);
    for(auto X:S)cout<<X<<"\n";
}

 

转载于:https://www.cnblogs.com/BobHuang/p/11223853.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值