写这篇博客离做比赛的时间太长了,前两题题意直接过了,这两道好写
A、
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int x,y;
cin>>x>>y;
if (x>=y)
cout<<0<<endl;
else
cout<<(y-x+9)/10<<endl;
return 0;
}
B、
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int l,r;
string s;
cin>>l>>r>>s;
string s1 = s.substr(0,l-1);
string s2 = s.substr(l-1,r-l+1);
string s3 = s.substr(r);
reverse(s2.begin(),s2.end());
cout<<s1+s2+s3<<endl;
return 0;
}
C、
题目大意:有n个包,每个包里有若干带数字的球,让你每个包里面选一个球使得数字乘积为x,最后让你求满足等于x的方案数。
这题是爆搜好想,但是减枝容易忽略。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long LL;
vector<vector<int>> a;
LL n;
LL x;
int res = 0;
void dfs(int u,LL sum)
{
if (u==n)
{
if (sum==x) res++;
return;
}
for (int i=0;i<a[u].size();i++)
{
if (sum>x/a[u][i]) continue;
dfs(u+1,sum*a[u][i]);
}
}
int main()
{
scanf ("%lld%lld",&n,&x);
for (int i=0;i<n;i++)
{
vector<int> t;
int k;
cin>>k;
for (int j=1;j<=k;j++)
{
int p;
scanf ("%d",&p);
t.push_back(p);
}
a.push_back(t);
}
dfs(0,1);
cout<<res;
return 0;
}
D、
题意:给你一个长度为n的一个序列和一个数字K,问你有多少连续子序列和等于K。
思路:一看1e5暴力过不去,想到了蓝桥杯上考的K倍区间,就是用的前缀和加哈希。其实仔细想也能想到,每次遍历l,那个凑成K的数字是确定的,只要找到前缀和是这个的,相减就是K。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
int a[N];
int main()
{
map<LL,LL> mh;
LL n,k;
scanf ("%lld%lld",&n,&k);
vector<LL> sum(n+1);
sum[0] = 0;
LL res = 0;
mh[0] = 1;
for (int i=1;i<=n;i++)
{
int x;
scanf ("%d",&x);
sum[i]+=sum[i-1]+x;
res+=mh[sum[i]-k];
// cout<<sum[i]-k<<' '<<mh[sum[i]-k]<<endl;
mh[sum[i]]++;
}
cout<<res<<endl;
return 0;
}
E、
题意:
从题上得先看出来一点,就是X不论多大一定是小数点一直向左移到不能移为止,因为X最多50万位,而k最大到1e100位。
模拟一下就能发现规律,直接搬题解上的图
#include<bits/stdc++.h>
using namespace std;
int main() {
string x; cin >> x;
int s = 0;
for (auto c : x) {
s += c - '0';
}
vector<int> r;
int c = 0;
for (int i = x.size() - 1;; i--) {
r.push_back((s + c) % 10);
c = (s + c) / 10;
if (i >= 0) s -= x[i] - '0';
if (i<=0&&c==0) break;
}
while (r.back() == 0) r.pop_back();
reverse(r.begin(), r.end());
for (auto t : r) cout << t;
cout << endl;
}