2022 年下学年第 1 周周赛

题解

Li Yu
Written by Li Yu on

A.cpp

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

#include<iostream>
using namespace std;
int n, ans, a;
int main()
{
	cin >> n;
	while(n--)
	{
		cin >> a;
		ans = 1e9 + 1;
		if(a % 3)
		{
			for(int i = -2; i < 3; i++)
				if((a-i*2) % 3 == 0)
					ans = min(ans,abs((a-i*2)/3) + abs(i));
		}
		else ans = a / 3;
		cout << ans << endl; 
	}
	return 0;
}

B.cpp

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

#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    int t;
    cin >> t;
    while (t--) {
        int m, n;
        cin >> m >> n;
        string cons(n, 'B');
        while (m--) {
            int k;
            cin >> k;
            k--;
            if (k >= n / 2) {
                k = n - 1 - k;
            }
            if (cons[k] == 'B') {
                cons[k] = 'A';
            } else if (cons[n - 1 - k] == 'B') {
                cons[n - 1 - k] = 'A';
            }
        }
        cout << cons << endl;
    }
    return 0;
}

C.cpp

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

#include<iostream>
#include<string>
using namespace std;
int m;
double correct = 0, n = 0;
string a,b,c;
void judge(string a, string b)
{
	for(int i = 0; i < a.length(); i++)
		if(a[i] != b[i]) return;
	correct++;
}
int main()
{
	cin >> n >> m;
	getline(cin, c);
	for(int i = 0; i < n; i++)
	{
		getline(cin, a);
		getline(cin, b);
		judge(a, b);	
	}
	printf("%.2lf%%\n", correct/n*100);
	return 0;
}

D.cpp

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

#include <iostream>
using namespace std;
 
int main()
{
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        n -= 4;
        int ans;
        switch (n % 3) {
            case 0: case 1:
                ans = n / 3 - 1;
                break;
            default:   // 2
                ans = n / 3;
                break;
        }
        cout << ans << endl;
    }
    return 0;
}

E.cpp

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

#include<iostream>
using namespace std;
int t, n, k, a, num;
int main()
{
	cin >> t;
	while(t--)
	{
		cin >> n >> k;
		num = 0;
		for(int i = 0 ; i < n; i++)
		{
			cin >> a;
			if(a == 1) num++;
		}
		if(num == 0)	cout << "NO" << endl;
		else	cout << "YES" << endl;
	}
	return 0;
}

F.cpp

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

#include <iostream>
using namespace std;
char arr[8];
int data[8];
int md[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
bool flag1 = 1, flag2 = 1;
void solve()
{
    while(1)
    {
      data[3] ++;
      if(data[3] == 10)
      {
        data[2]++;
        data[3] = 0;
      }
      if(data[2] == 10) 
      {
        data[1]++;
        data[2] = 0;
      }
      if(data[1] == 10)
      {
        data[0]++;
        data[1] = 0;
      }
      int year = 0;
      for(int i = 0; i < 4; i++)
      {
        data[7-i] = data[i];
        year = year * 10 + data[i];
      }
      int month = data[4] * 10 + data[5];
      int day = data[6] * 10 + data[7];
      if(year % 400) md[1] = 28;
      else md[1] = 29;
      if(month > 12 || md[month - 1] < day) continue;
      if(flag1 || flag2)
      {
        if(flag1)
        {
          for(int i = 0; i < 8; i++)
            cout << data[i] ;
          cout << endl;
          flag1 = 0;
        }
        if(flag2)
        {
          if(data[0] == data[2] && data[1] == data[3] && data[1] != data[2])
          {
             for(int i = 0; i < 8; i++)
              cout << data[i] ;
            cout << endl;
            flag2 = 0;
          }
        }
      }
      if(!flag1 && !flag2) break;
    }
}
int main()
{
  for(int i = 0; i < 8; i++)
  {
    cin >> arr[i];
    data[i] = arr[i] - '0';
  }
  for(int i = 3; i >= 0 ;i--)
  {
      if(data[i] > data[7 - i])
      {
          data[3]--;
          break;    
      }
  }
  solve();
  return 0;
}

F.c

#include<stdio.h>
int Ahuiwendate(int n) {
  while (n) {
    n++;
    int year = n / 10000;
    int day = n % 100;
    int month = (n % 10000) / 100;
    int uday = (day % 10) * 10 + day / 10;
    int umonth = (month % 10) * 10 + month / 10;
    if (year / 100 == uday && day < 31 && day > 0 && year % 100 == umonth && month < 13 && month > 0) {
      break;
    }
  }
  return n;
}
int Bhuiwendate(int n)
{
  while (n)
  {
    n++;
    int year = n / 10000;
    int day = n % 100;
    int month = (n % 10000) / 100;
    int uday = (day % 10) * 10 + day / 10;
    int umonth = (month % 10) * 10 + month / 10;
    if (day == month && year / 100 == uday && day < 31 && day > 0 && year % 100 == umonth && month < 13 && month > 0)
    {
      break;
    }
  }
  return n;
}
int main()
{
  int n;
  scanf("%d", &n);
  int x = Ahuiwendate(n);
  printf("%d\n", x);
  int y = Bhuiwendate(n);
  printf("%d\n", y);
  return 0;
}
Li Yu

Li Yu

Comments

comments powered by Disqus