牛客小白月赛 16

A 小石的签到题 https://ac.nowcoder.com/acm/contest/949/A
题意:。。博弈问题,找到必输的点

思路:只剩一个的时候,先手必败
代码:

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin>>n;
    if(n==1) puts("Yang");
    else puts("Shi");
    return 0;
}

B 小雨的三角形 https://ac.nowcoder.com/acm/contest/949/B
题意:杨辉三角第x行到第y行的和
思路:打表运算
代码
方法1:

#include <iostream>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int Maxn = 1010;
ll sum[Maxn], xx[Maxn][Maxn];

int main() {
    sum[1] = 1;
    xx[1][1] = 1;打表杨辉三角
    for (int i = 1; i <= 1001; i++) {
        if (i != 1) sum[i] += i + i;
        xx[i][1] = i, xx[i][i] = i;
        for (int j = 2; j < i; j++) {
            xx[i][j] = ((xx[i - 1][j - 1] )%mod+ (xx[i - 1][j])%mod)%mod;
            sum[i] = (sum[i]%mod+xx[i][j]%mod)%mod;
        }
    }
    int n, m;
    cin >> n >> m;
    int x,y;
    while(m--)
    {
        cin>>x>>y;
        ll ans=0;
        for(int i=x; i<=y; i++)
            ans=(ans%mod+sum[i]%mod)%mod;
        cout<<ans%mod<<endl;
    }
    return 0;
}

涉及知识点:
(1) 杨辉三角建立规律
(2)前缀和运算
(3)取余技巧:(a+b)%mod=(a%mod+b%mod)%mod;
取余技巧还没get…
方法2:
是看别的博客的,链接:https://blog.csdn.net/qq_44702847/article/details/95728343
刚开始觉得是推公式的,对不起,我太弱了。。。
我推出来每行的和是:2的x次方+2的x-1次方-2(对不起,我还不会打次方。)
jio的快速幂挺好的,真棒。。
然鹅没写出来,看了别人代码:a[n]=2*a[n-1]+2;
对不起,我太弱了2333
代码:

#include <iostream>

#define ll long long
using namespace std;
const int mod = 1e9 + 7;
const int Maxn = 1010;
ll sum[Maxn], a[Maxn];

int main() {
    int n, m;
    cin >> n >> m;
    a[1] = 1;
    for (int i = 2; i < 1005; i++)
        a[i] = (2 * a[i - 1]) %mod+ 2;
    int x, y;
    while (m--) {
        ll ans=0;
        cin >> x >> y;
       for(int i=x; i<=y; i++)
           ans+=a[i];
       cout<<ans%mod<<endl;
    }
    return 0;
}

方法3:贼心不死,想试试我的快速幂
对不起,待修改。。
快速幂取余刚开始没写好

#include <iostream>

#define ll long long
using namespace std;
const int mod = 1e9 + 7;
const int Maxn = 1010;
ll sum[Maxn], a[Maxn];

ll Pow(ll x, ll y) {
    ll ans = 1;
    while (y) {
        if (y & 1) ans = (x * ans) % mod;
        x = (x * x) % mod;
        y >>= 1;
    }
    return ans;
}

int main() {
    int n, m;
    cin >> n >> m;
    int x, y;
    while (m--) {
        cin >> x >> y;
        ll s = 0;
        for (int i = x; i <= y; i++)
            s += (Pow(2, i) % mod + Pow(2, i - 1) % mod)%mod - 2;
        cout << s % mod << endl;
    }
    return 0;
}

C:小石的海岛之旅 https://ac.nowcoder.com/acm/contest/949/C
**题意:**求比h高有几块,有连续情况记一块,单独的记一块
我真的没看懂题,想组合数学。。
思路:。。。。就这样
代码:

#include<bits/stdc++.h>

#define ll long long
using namespace std;
const int maxn = 1005;
const int mod = 1e9 + 7;
int  a[maxn];
int sum[maxn];

int main() {
    int n,m;
    cin>>n>>m;
   for(int i=0; i<n; i++)
        cin>>a[i];
    int h;
    while(m--)
    {
        cin>>h;
        int ans=0;
        for(int i=0; i<n; i++)
        {
            if(a[i]>h&&a[i+1]<=h)
                ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}

D:小阳买水果 https://ac.nowcoder.com/acm/contest/949/D
题意:找最长的和为正的序列长度
思路:前缀和记录和,找差值最大
代码:

#include <bits/stdc++.h>

using namespace std;
const int Maxn = 2e6 + 10;
struct node {
    int pos;
    int num;
} a[Maxn];

bool cmp(node n, node m) {
    if (n.pos == m.pos) return n.num < m.num;
    return n.num < m.num;
}

int main() {
    int n, x;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> x;
        a[i].pos = i;
        a[i].num = a[i - 1].num + x;
    }
    sort(a + 1, a + n + 1, cmp);
    n++;///防止ans==n情况
    int minpos = n;
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        minpos = min(minpos, a[i].pos);///取编号最小位置(更新)
        if (minpos < a[i].pos) ans = max(ans, a[i].pos - minpos);//差值最大
    }
    cout << ans << endl;
    return 0;
}

E 小雨的矩阵 https://ac.nowcoder.com/acm/contest/949/E
题意:dfs搜,只能向右或向下
思路: 。。
代码:

#include <bits/stdc++.h>

using namespace std;
const int Maxn = 1e3;
set<int> s;
int Map[Maxn][Maxn];
int n;
void dfs(int x, int y, int trap) {
    if(x>n||y>n) return ;
    trap+=Map[x][y];
    if(x==n&&y==n)
    {
        s.insert(trap);
        return ;
    }
   if(x<n) dfs(x+1,y,trap);
   if(y<n) dfs(x,y+1,trap);
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            cin >> Map[i][j];
    dfs(1, 1, 0);
    cout << s.size() << endl;
    return 0;
}

剩余题目涉及线段树,待补。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值