题目1:AcWing 3321.ATM队列

N 个人(编号 1∼N),排成一队在 ATM 机前准备取钱。

初始时,队列按编号升序的顺序排列。

第 i 个人需要取 Ai 元钱。
一个人一次最多可以取 X 元钱。

当轮到某个人取钱时,如果其需要的钱的数量大于 X,则只能先取 X 元钱,然后去队尾重新排队,等待下次轮到他取钱时,继续去取。

当一个人取够钱时,他就会拿着钱离开队列。

现在,请你确定所有人离开队列的顺序。

代码如下

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
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;

pair<int,int> a[N];

int main()
{
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
printf("Case #%d: ",i);
int n,x;
scanf("%d %d",&n,&x);
for(int j=1;j<=n;j++)
{
int y;
scanf("%d",&y);
a[j]={(y-1)/x,j};//直接计算轮次,需要注意当待取钱数等于一次最多能去的钱数的情况
}
sort(a+1,a+n+1);
for(int j=1;j<=n;j++) printf("%d ",a[j].second);
cout<<endl;
}


return 0;
}

题目2:AcWing 4122.字符串转换

给定一个由小写字母构成的字符串 S。

再给定一个由若干个各不相同的小写字母按字典序排序构成的字符串 F。

现在,你可以对字符串 S 进行字符转换操作。

每次选中其中一个字符(即某个小写字母),将其转换为一个按照字母顺序与其相邻(上一个或下一个)的小写字母。

例如,c 可以转换为 b 或 d。

额外的,我们将按照循环顺序考虑字母,即我们认为 a 的上一个字母为 z,z 的下一个字母为 a。

请问,至少需要进行多少次操作,可以使得字符串 S 中的每个字母都出现在字符串 F 中。

代码如下

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
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
int t;
cin >> t;
for (int i = 1; i <= t; i++)
{
string s, f;
cin >> s >> f;
int ans = 0;
for (int a = 0; a < s.size(); a++)
{
int m = 26;
for (int b = 0; b < f.size(); b++)
{
m = min(m, abs(s[a] - f[b]));
m = min(m, abs(s[a] + 26 - f[b]));
m = min(m, abs(s[a] - 26 - f[b]));
}
ans += m;
}
printf("Case #%d: %d\n", i, ans);
}

return 0;
}