Atcoderabc233题解
Atcoder abc 233 题解
A 10yen Stamp
答案就是两个数字的差/10之后上取整
记得判断res=0的情况就可以了
c++代码
B - A Reverse
题意
第⼀⾏输⼊⼀个, 第⼆⾏输⼊⼀个字符串 输出将字符串 的第到的⼦串
c++代码#include<iostream>#include<algorithm>#include<cstring>#include<cmath>using namespace std;int main(){ int x,y; scanf("%d %d",&x,&y); if(x>=y) { puts("0"); return 0; } else { int t=ceil(1.0*(y-x)/10); cout<<t<<endl; return 0; }}
1
2
3
4
5
6
7
8cstring转为int
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23L R
S
S L R
C - Product
题意
有个背包, 背包⾥⾯装了个球, 每个球的的质量为, 问有多少种⽅式可以在每个包⾥⾯选择⼀个球使选择的球的质量的乘积为思路
根据题⽬给的数据范围可以知道所有包中的球数量的乘积最多是,所以这⼀题⽤dfs dfs的参数:选择到了第⼏组,现在的乘积是多少
剪枝:当乘积⼤于需要剪枝
注意:需要开ll 要不然会爆掉
c++代码using namespace std;const int N=1e5+10;char s[N];int main(){ int l,r; cin>>l>>r; cin>>s+1;
string res; int n=strlen(s+1); int mid=(l+r)>>1; for(int i=1;i<=n;i++) { if(i>=l&&i<=mid) swap(s[i],s[l+r-i]); } cout<<(s+1)<<endl;}
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23N i L i a ,j i N 105X
D - Count Interval
题意
给⼀个数组和⼀个整数,计算有多少个,满⾜数组A的[L,R]的和为K 思路#include<vector>#include<map>#include<unordered_map>using namespace std;typedef long long ll;const int N=1e5+10;vector<ll> a[N];ll sum;int n;int res=0;void dfs(ll pos,ll now)//选择到了第⼏个背包 现在背包的重量是多少{ if(pos==n)//递归出⼝ 全部处理完 { if(now==sum) res++; return ; } for(int i=0;i<a[pos].size();i++)//枚举这个背包⾥⾯选择哪⼀个 { if((ll)a[pos][i]*now>sum) continue;//剪枝 else { dfs(pos+1,now*a[pos][i]); } }}int main(){ cin>>n>>sum; for(int i=0;i<n;i++) { int s; scanf("%d",&s); for(int j=0;j<s;j++) { int x; scanf("%d",&x); a[i].push_back(x); } } dfs(0,1); cout<<res<<endl;}
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52A K (L R )
这是⼀道很简单的前缀和问题
设Sum[]是数组A的前缀和数组,数组A在[L,R]的和就是Sum[r]-Sum[L-1]那么在这⾥我们只需要⽤map记录⼀下前缀和出现的次数然后进⾏计算就可以啦注意:记得开long long 初始化mp[0]=1(选择的L为1的时候)
c++代码
E - Σ[k=0…10k)
题意
计算题⽬所给出式⼦的值
思路
⼿动模拟⼀下可以得到这个#include<iostream>#include<algorithm>#include<cstring>#include<unordered_map>using namespace std;typedef long long ll;const int N=2e5+10;ll a[N];ll k;int n;unordered_map<ll,int> mp;int main(){ cin>>n>>k; mp[0]=1; ll sum=0; ll res=0; for(int i=1;i<=n;i++) { ll x; scanf("%lld",&x); sum+=x; res+=mp[sum-k]; mp[sum]++; } cout<<res<<endl;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31100]floor(X /10 123456+ 12345.6+ 1234.56+ 123.3456+ 12.3456+ 1.3456--------------=137171
1
2
3
4
5
6
7
8
9
这么⼀看思路就很简单了
倒数第⼀位 = 1 + 2 + 3 + 4 + 5 + 6
倒数第⼆位 = 1 + 2 + 3 + 4 + 5
倒数第三位 = 1 + 2 + 3 + 4
倒数第四位 = 1 + 2 + 3
倒数第五位 = 1 + 2
倒数第六位 = 1
由于数据很⼤ 所以需要⽤string存下来再进⾏计算c++代码
F - Swap and Sort
题意
给你⼀个全排列,再给种操作,第种操作可以交换P中的与位置上的数字问能否在个操作之内让P变为有序如果可以输出顺序,不可以输出-1
思路#include<iostream>#include<algorithm>#include<cstring>#include<vector>using namespace std;string x;int n;void print(vector<int> &res){ for(auto t:res) cout<<t; cout<<endl;}int main(){ cin>>x; n=x.size(); int sum=0; for(int i=0;i<n;i++) { sum+=x[i]-'0'; } vector<int> res; int t=0; for(int i=n-1;i>=0;i--) { t+=sum; res.push_back(t%10); t/=10; sum-=(x[i]-'0'); } if(t) res.push_back(t); reverse(res.begin(),d()); print(res);}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37P i M i a i b i 5∗105
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论