Codeforces Round #713 (Div. 3)AB題

wdxt發表於2021-05-18

Codeforces Round #713 (Div. 3) Editorial

記錄一下自己寫的前二題本人比較菜

A. Spy Detected!

You are given an array a consisting of n (n≥3) positive integers. It is known that in this array, all the numbers except one are the same (for example, in the array [4,11,4,4] all numbers except one are equal to 4).

Print the index of the element that does not equal others. The numbers in the array are numbered from one.

Input
The first line contains a single integer t (1≤t≤100). Then t test cases follow.

The first line of each test case contains a single integer n (3≤n≤100) — the length of the array a.

The second line of each test case contains n integers a1,a2,…,an (1≤ai≤100).

It is guaranteed that all the numbers except one in the a array are the same.

Output
For each test case, output a single integer — the index of the element that is not equal to others.

樣例

4
4
11 13 11 11
5
1 4 4 4 4
10
3 3 3 3 10 3 3 3 3 3
3
20 20 10

輸出

2
1
5
3

題意:

就是有t組測試資料,每個測試資料給我們一個長度為n的陣列,其中n>=3且陣列中的元素值只有2個,而且其中1個元素在陣列中只有一個,讓我們求該元素的下標。

思路:

這個思路很簡單,因為陣列長度不超過100,且其中的元素也不超過100,那麼我們可以開2個陣列,p和s,其中p就是我們存的陣列,而s就當雜湊表一樣存陣列值對應的個數,然後我們再列舉一下s其中為1的就是我們要找的元素,然後返回下標就好了。

C++ 程式碼

#include <algorithm>
#include <cstring>
#include <iostream>
 
using namespace std;
 
const int N = 110;
int t, n;
int s[N];
int p[N]; 
int main()
{
    scanf("%d", &t);
 
    while (t--)
    {
        memset(s, 0, sizeof s); // 每次測試資料的時候都應該把s都置為0
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            cin >> p[i]; 
            s[p[i]]++; // 將p[i] 所對應的值對映到s中去,並且計數
        }
        // 這是列舉出來s[]所對應元素為1的就是我們要找的元素,然後返回就好了
        for (int i = 1; i <= n; i++)
        {
            if (s[p[i]] == 1)
            {
                printf("%d\n", i);
            }
        }
    }
    return 0;
}

B. Almost Rectangle

There is a square field of size n×n in which two cells are marked. These cells can be in the same row or column.

You are to mark two more cells so that they are the corners of a rectangle with sides parallel to the coordinate axes.

For example, if n=4 and a rectangular field looks like this (there are asterisks in the marked cells):

. . ∗ .

. . . .

∗ . . .

. . . .

Then you can mark two more cells as follows

∗ . ∗ .

. . . .

∗ . ∗ .

. . . .

If there are several possible solutions, then print any of them.

Input
The first line contains a single integer t (1≤t≤400). Then t test cases follow.

The first row of each test case contains a single integer n (2≤n≤400) — the number of rows and columns in the table.

The following n lines each contain n characters '.' or '*' denoting empty and marked cells, respectively.

It is guaranteed that the sums of n for all test cases do not exceed 400.

It is guaranteed that there are exactly two asterisks on the field. They can be in the same row/column.

It is guaranteed that the solution exists.

Output
For each test case, output n rows of n characters — a field with four asterisks marked corresponding to the statements. If there multiple correct answers, print any of them.

樣例

6
4
..*.
....
*...
....
2
*.
.*
2
.*
.*
3
*.*
...
...
5
.....
..*..
.....
.*...
.....
4
....
....
*...
*...

輸出

*.*.
....
*.*.
....
**
**
**
**
*.*
*.*
...
.....
.**..
.....
.**..
.....
....
....
**..
**..

題意

有t組測試資料,每個測試資料輸入一個數字n表示接下來要輸入一個n*n的字元矩陣,且矩陣中有且只有2個*然後我們需要填入2個*讓這四個*能夠對稱,要是有多組的話就輸出一組就好了。

思路

本人太菜了,剛看到這題目的時候都沒想啥辦法,就直接寫了,然後寫了好多判斷不好讀。我就說一下我看到的一個比較好的做法把。
我們可以用2個陣列存2個*號的座標。
這個時候我們可以發現有2中情況如下:
第一種:就是2個*號的橫縱座標都不相等,那麼這個時候我們只需要將他們交錯的座標位置都用*號代替就好了。
第二種:就是其中的橫座標或者縱座標相等(不可能橫縱座標都相等,因為必須要有2個*嘛)這個時候用了一個非常巧妙的辦法就是,a[0] = a[1] == 0 這個判斷讓我們減少了所有的邊界條件的判斷,這是當橫座標相等的時候,如果縱座標也相等的話我們就將a換成縱座標的就好了。
接著我們看一下程式碼吧。

程式碼

// 題目地址
// https://codeforces.com/contest/1512/problem/B

#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

const int N = 410;

int t, n;
char g[N][N];

int a[2];
int b[2];

int main()
{
    scanf("%d", &t);

    while (t--)
    {
        scanf("%d", &n);

        for (int i = 0; i < n; i++)
            scanf("%s", g[i]);

        int t = 0;
        // 找到2個*的下標位置
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
            {
                if (g[i][j] == '*')
                {
                    a[t] = i;
                    b[t++] = j;
                }
            }

        /*
        我們可以知道這個只有三種情況
        第一種:*的2個座標都不等那麼我們只需要
                直接將他們的交叉座標點變為*就可以了。
        第二種: *的x座標相等那麼我們就可以通過
                a[0] = a[1] == 0的方式來處理
                如果a[1],等於0的話我們就讓a[0]取1,
                如果不等的話就讓a[0]取0,
                因為我們可以輸出任意一種就好了。
        第三種:同第二種差不多*在y座標上相等
        */
        if (a[0] == a[1])
            a[0] = a[1] == 0;
        if (b[0] == b[1])
            b[0] = b[1] == 0;

        for (int i = 0; i < 2; i++)
            for (int j = 0; j < 2; j++)
                g[a[i]][b[j]] = '*';

        for (int i = 0; i < n; i++)
            printf("%s\n", g[i]);
    }

    //system("pause");
    return 0;
}

第一次寫程式碼題解,記錄下我做過的一些題目,要是大佬們發現有什麼錯誤的地方,還望多多指出錯誤之處,orz orz orz。

相關文章