2022 年下学年第 1 周周赛

A.cpp

基本思路:一个个写例发现是个循环群,不断的取构造 3的倍数来计算循环群所对应的结果。

 1#include<iostream>
 2using namespace std;
 3int n, ans, a;
 4int main()
 5{
 6	cin >> n;
 7	while(n--)
 8	{
 9		cin >> a;
10		ans = 1e9 + 1;
11		if(a % 3)
12		{
13			for(int i = -2; i < 3; i++)
14				if((a-i*2) % 3 == 0)
15					ans = min(ans,abs((a-i*2)/3) + abs(i));
16		}
17		else ans = a / 3;
18		cout << ans << endl; 
19	}
20	return 0;
21}

B.cpp

基本思路:对于新读入的一个数,判断最小的位置是否改变,若没有改变就改变,若已改变就查 m+1-ai

 1#include <iostream>
 2#include <string>
 3using namespace std;
 4 
 5int main()
 6{
 7    int t;
 8    cin >> t;
 9    while (t--) {
10        int m, n;
11        cin >> m >> n;
12        string cons(n, 'B');
13        while (m--) {
14            int k;
15            cin >> k;
16            k--;
17            if (k >= n / 2) {
18                k = n - 1 - k;
19            }
20            if (cons[k] == 'B') {
21                cons[k] = 'A';
22            } else if (cons[n - 1 - k] == 'B') {
23                cons[n - 1 - k] = 'A';
24            }
25        }
26        cout << cons << endl;
27    }
28    return 0;
29}

C.cpp

基本思路:水题,主要是 CNN 准确率计算,对于一个矩阵来说,需要计算正确元素的个数 / 总元素的个数。

 1#include<iostream>
 2#include<string>
 3using namespace std;
 4int m;
 5double correct = 0, n = 0;
 6string a,b,c;
 7void judge(string a, string b)
 8{
 9	for(int i = 0; i < a.length(); i++)
10		if(a[i] != b[i]) return;
11	correct++;
12}
13int main()
14{
15	cin >> n >> m;
16	getline(cin, c);
17	for(int i = 0; i < n; i++)
18	{
19		getline(cin, a);
20		getline(cin, b);
21		judge(a, b);	
22	}
23	printf("%.2lf%%\n", correct/n*100);
24	return 0;
25}

D.cpp

基本思路: 此处尽可能大是讲日期尽可能的分成二等段即 abs(l1 - l2) abs(l2 - l3) 差最小的时候。

 1#include <iostream>
 2using namespace std;
 3 
 4int main()
 5{
 6    int t;
 7    cin >> t;
 8    while (t--) {
 9        int n;
10        cin >> n;
11        n -= 4;
12        int ans;
13        switch (n % 3) {
14            case 0: case 1:
15                ans = n / 3 - 1;
16                break;
17            default:   // 2
18                ans = n / 3;
19                break;
20        }
21        cout << ans << endl;
22    }
23    return 0;
24}

E.cpp

基本思路:仔细想想,如果有 1 的话,左右两边合并成什么都不重要了,我只要保证最后一次合并有个 1 存在就行,而且题目限制 k <= n. 所以如果有 1 的话,总可以成功。

 1#include<iostream>
 2using namespace std;
 3int t, n, k, a, num;
 4int main()
 5{
 6	cin >> t;
 7	while(t--)
 8	{
 9		cin >> n >> k;
10		num = 0;
11		for(int i = 0 ; i < n; i++)
12		{
13			cin >> a;
14			if(a == 1) num++;
15		}
16		if(num == 0)	cout << "NO" << endl;
17		else	cout << "YES" << endl;
18	}
19	return 0;
20}

F.cpp

基本思路: 模拟水题,对于回文日期,直接从年份开始++,然后倒序复制到月份和日上,剩下的判断日期是否合理就行,对于这种解法,需要考虑 20200101 这类日期。

 1#include <iostream>
 2using namespace std;
 3char arr[8];
 4int data[8];
 5int md[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
 6bool flag1 = 1, flag2 = 1;
 7void solve()
 8{
 9    while(1)
10    {
11      data[3] ++;
12      if(data[3] == 10)
13      {
14        data[2]++;
15        data[3] = 0;
16      }
17      if(data[2] == 10) 
18      {
19        data[1]++;
20        data[2] = 0;
21      }
22      if(data[1] == 10)
23      {
24        data[0]++;
25        data[1] = 0;
26      }
27      int year = 0;
28      for(int i = 0; i < 4; i++)
29      {
30        data[7-i] = data[i];
31        year = year * 10 + data[i];
32      }
33      int month = data[4] * 10 + data[5];
34      int day = data[6] * 10 + data[7];
35      if(year % 400) md[1] = 28;
36      else md[1] = 29;
37      if(month > 12 || md[month - 1] < day) continue;
38      if(flag1 || flag2)
39      {
40        if(flag1)
41        {
42          for(int i = 0; i < 8; i++)
43            cout << data[i] ;
44          cout << endl;
45          flag1 = 0;
46        }
47        if(flag2)
48        {
49          if(data[0] == data[2] && data[1] == data[3] && data[1] != data[2])
50          {
51             for(int i = 0; i < 8; i++)
52              cout << data[i] ;
53            cout << endl;
54            flag2 = 0;
55          }
56        }
57      }
58      if(!flag1 && !flag2) break;
59    }
60}
61int main()
62{
63  for(int i = 0; i < 8; i++)
64  {
65    cin >> arr[i];
66    data[i] = arr[i] - '0';
67  }
68  for(int i = 3; i >= 0 ;i--)
69  {
70      if(data[i] > data[7 - i])
71      {
72          data[3]--;
73          break;    
74      }
75  }
76  solve();
77  return 0;
78}

F.c

 1#include<stdio.h>
 2int Ahuiwendate(int n) {
 3  while (n) {
 4    n++;
 5    int year = n / 10000;
 6    int day = n % 100;
 7    int month = (n % 10000) / 100;
 8    int uday = (day % 10) * 10 + day / 10;
 9    int umonth = (month % 10) * 10 + month / 10;
10    if (year / 100 == uday && day < 31 && day > 0 && year % 100 == umonth && month < 13 && month > 0) {
11      break;
12    }
13  }
14  return n;
15}
16int Bhuiwendate(int n)
17{
18  while (n)
19  {
20    n++;
21    int year = n / 10000;
22    int day = n % 100;
23    int month = (n % 10000) / 100;
24    int uday = (day % 10) * 10 + day / 10;
25    int umonth = (month % 10) * 10 + month / 10;
26    if (day == month && year / 100 == uday && day < 31 && day > 0 && year % 100 == umonth && month < 13 && month > 0)
27    {
28      break;
29    }
30  }
31  return n;
32}
33int main()
34{
35  int n;
36  scanf("%d", &n);
37  int x = Ahuiwendate(n);
38  printf("%d\n", x);
39  int y = Bhuiwendate(n);
40  printf("%d\n", y);
41  return 0;
42}