Codeforces Round #719 (Div. 3) [未完待续]

A. Do Not Be Distracted!

题目描述
image
image

参考题解

直接模拟, set判重

#include <iostream>
#include <cstdio>
#include <set>
#include <string>

using namespace std;

bool func()
{
    int n;
    cin >> n;
    set<char> ha;
    char last = '0';
    string ttp;
    cin >> ttp;
    for(int i = 0; i < ttp.size(); ++ i)
    {
        char tp = ttp[i];
        if(tp == last)  continue;
        if(ha.count(tp))
        {
            return false;
        }
        else
        {
            ha.insert(tp);
            last = tp;
        }
    }
    return true;
}

int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        if(func())
        {
            cout << "YES" << endl;
        }
        else
        {
            cout << "NO" << endl;
        }
    }
    return 0;
}

B. Ordinary Numbers

题目描述
image

参考题解

题解链接

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 105;

typedef long long LL;

int ans[N][N];

bool check(int x)
{
    int bit = x%10;
    while(x)
    {
        if(x%10 != bit)
        {
            return false;
        }
        x /= 10;
    }
    return true;
}

int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        int n;
        scanf("%d", &n);
        int bit = to_string(n).size();
        int ans = 0;
        ans += (bit-1)*9;
        for(int i = 1; i <= 9; ++ i)
        {
            LL num = stoll(string(bit, '0'+i));
            if(num <= n)
            {
                ans ++;
            }
        }
        cout << ans << endl;
    }
    return 0;
}

C. Not Adjacent Matrix

题目描述
image

参考题解

题解来源
构造问题,要让相邻单元格的差值不为1。
能构造输出,不能就直接-1。
所以想到用奇数和奇数相邻,偶数和偶数相邻。
可以先从小到大填充所有的奇数,填完奇数之后再从小到大填充完所有的偶数。
这种做法除了n = 2不满足情况应当输出-1外,其他的均可满足。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 105;

int ans[N][N];

int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        int n;
        scanf("%d", &n);
        if(n == 2)
        {
            printf("-1\n");
            continue;
        }
        memset(ans, 0, sizeof ans);
        int k = 1;
        for(int i = 0; i < n; ++ i)
        {
            for(int j = 0; j < n; ++ j, k += 2)
            {
                if(k > n*n)
                {
                    k = 2;
                }
                ans[i][j] = k;
            }
        }
        for(int i = 0; i < n; ++ i)
        {
            for(int j= 0; j < n; ++ j)
            {
                if(j != 0)
                {
                    cout << " " << ans[i][j];
                }
                else
                {
                    cout << ans[i][j];
                }
            }
            cout << endl;
        }
    }
    return 0;
}

D. Same Differences

题目描述
image

参考题解

aj - ai == j - i ==> aj - j == ai - i
注意ai-i取值范围(-n, n)

#include <iostream>
#include <cstdio>
#include <set>
#include <string>
#include <cstring>

using namespace std;

const int N = 2e5+5;
typedef long long LL;

int a[N*2];
int n;

int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        memset(a, 0, sizeof(a));
        cin >> n;
        for(int i = 0; i < n; ++ i)
        {
            int tp;
            cin >> tp;
            a[tp-i+n] ++;
        }
        LL ans = 0;
        for(int i = 0; i <= n*2; ++ i)
        {
            ans = (ans + (LL)a[i]*(a[i]-1)/2);
        }
        cout << ans << endl;
    }
    return 0;
}

E. Arranging The Sheep

题目描述
image
image

参考题解

绝对值三角不等式使用以下,取中间的绵羊就可以了

#include <iostream>
#include <cstdio>
#include <set>
#include <string>
#include <cstring>

using namespace std;

const int N = 2e5+5;
typedef long long LL;

LL func()
{
    int n;
    cin >> n;
    string s;
    cin >> s;
    int l, r;
    int cnt = 0;
    for(int i = 0; i < s.size(); ++ i)
    {
        if(s[i] == '*')
        {
            cnt ++;
        }
    }
    int tp = (cnt+1)/2;
    cnt = 0;
    int mid = 0;
    for(int i = 0; i < s.size(); ++ i)
    {
        if(s[i] == '*')
        {
            cnt ++;
            if(cnt == tp)
            {
                mid = i;
                break;
            }
        }
    }
    LL ans = 0;
    cnt = 1;
    for(l = mid-1; l >= 0; -- l)
    {
        if(s[l] == '*')
        {
            ans += (mid-cnt-l);
            cnt ++;
        }
    }
    cnt = 1;
    for(int r = mid+1; r < s.size(); ++ r)
    {
        if(s[r] == '*')
        {
            ans += (r-(mid+cnt));
            cnt ++;
        }
    }
    return ans;
}

int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        cout << func() << endl;
    }
    return 0;
}

F1. Guess the K-th Zero (Easy version)

题目描述
image
image
image

参考题解

常规二分

#include <iostream>
#include <cstdio>

using namespace std;

int n, t, k;

//询问1的个数
int ask(int l, int r)
{
    printf("? %d %d\n", l, r);
    cout.flush();
    int res = -1;
    scanf("%d", &res);
    if(res == -1)
    {
        exit(0);
    }
    return res;
}

int main()
{
    cin >> n >> t >> k;
    int l = 1, r = n;
    while(l < r)
    {
        int mid = (l+r)/2;
        int lcnt = mid-l+1 - ask(l, mid);
        if(k <= lcnt)
        {
            r = mid;
        }
        else
        {
            l = mid+1;
            k -= lcnt;
        }
    }
    printf("! %d\n", l);
    return 0;
}
posted @ 2021-05-10 01:12  chaosliang  阅读(59)  评论(0)    收藏  举报