3900: 两袋面包

我们只需要按照题意解出即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>

using namespace std;

#define int long long
signed main() {
int y, k, n;

while (cin >> y >> k >> n) {
bool flag = false;
for (int i = 1; i < n - y; i++) {
if ((i + y) % k == 0) {
flag = true;
cout << i << " ";
}
}
if (!flag)
cout << "-1" << endl;
else
cout << endl;
}
}

1231: Lucky Numbers (easy)

这题可以采用模拟。

  • 当字符串长度为奇数时,结果应为$\frac{a.length() + 1}2$4 + $\frac{a.length() + 1}2 $7
  • 当字符串长度为偶数时
    • 若该数大于777...444,则应该长度加2取4444...7777
    • 若该数等于777...444,则直接输出该数
    • 若该数小于777...444,从高位开始。优先考虑4,然后再考虑7,同时我们要维持flag
      • 若有一位大于 输入,说明低位无论如何取值,整个字符串总是大于输入,则更新flag,后面尽可能多填4。
      • 若有一位等于输入,则填数continue。
      • 不存在小于输入的问题。
  • 注意数据范围,要使用stoll转化为长整型而不是stoi转化为整型。
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <string>
using namespace std;

string s, res;
int main() {
cin >> s;
res = "";
if (s.length() % 2 != 0) {
for (int i = 0; i < s.length() + 1; i += 2) {
res += "4";
}
for (int i = 0; i < s.length() + 1; i += 2) {
res += "7";
}
cout << res << endl;
return 0;
} else {
for (int i = 0; i < s.length(); i += 2) {
res += "7";
}
for (int i = 0; i < s.length(); i += 2) {
res += "4";
}
if (stoll(res) > stoll(s)) {
res = "";
bool flag = false;
int count = 0;
for(int i = 0; i < s.length(); i ++)
{
if(flag && count < s.length()/2)
{
count++;
res +='4';
continue;
}
if(s[i] < '4'&& count < s.length()/2)
{
flag = true;
res += '4';
count++;
continue;
}
if(s[i] == '4'&& count < s.length()/2)
{
res += '4';
count++;
continue;
}
if(s[i] < '7')
{
res += '7';
flag = true;
continue;
}
if(s[i] =='7')
{
res += '7';
continue;
}

}
cout << res << endl;
} else if (stoll(res) == stoll(s)) {
cout << res << endl;
return 0;

} else if (stoll(res) < stoll(s)) {
res = "";
for (int i = 0; i < s.length() + 2; i += 2) {
res += "4";
}
for (int i = 0; i < s.length() + 2; i += 2) {
res += "7";
}
cout << res << endl;
return 0;
}
}
}

同时,这道题更方便的做法是使用BFS生成字串,再将该子串与输入进行比较,我们只需要判断4和7的数量是否相等即可。

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
37
38
#include <iostream>
using namespace std;
#define int long long
int hh = 0, tt = -1;
const int N = 1e6;
int q[N];
int n;

bool judge(int tmp) {
int a = 0, b = 0;
while (tmp) {
int t = tmp % 10;
tmp /= 10;
if (t == 4)
a++;
if (t == 7)
b++;
}
return a == b;
}

void bfs() {
q[++tt] = 0;
for (int i = 0; i < N; i++) {
int tmp = q[hh++];
if (judge(tmp) && tmp >= n) {
cout << tmp << endl;
break;
}
q[++tt] = tmp * 10 + 4;
q[++tt] = tmp * 10 + 7;
}
}

signed main() {
cin >> n;
bfs();
}

2303: Points on Plane

//TODO

3234: Traffic Lights

主要是处理红绿灯的问题,这里可以先将红绿灯时间相加,到达红绿灯的时间除以一轮红绿灯的时间即可得到这是第几轮红绿灯,取余获得该轮第几秒,我们将一轮红绿灯的时间-取余的时间即可得到等待时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cmath>
#include <cstdio>
#include <iostream>

using namespace std;

int main() {
double l, d, v, g, r;
cin >> l >> d >> v >> g >> r;

double tmp = d / v; //时间
double rg = g + r; //

double time = fmod(tmp, rg);

if (time > g) {
time = rg - time;
tmp += time;
}
tmp += (l - d) / v;
printf("%.8lf", tmp);
}

3861: Lucky String

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>

using namespace std;

int main()
{
string s = "abcd";
int n;
cin >> n;
string res = "";
for(int i = 0; i < n; i++)
{
res += s[i % 4];
}
cout << res << endl;
}