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;
}
剩余题目涉及线段树,待补。。。