其他分享
首页 > 其他分享> > Codeforces Round #719 (Div. 3) A-E 题解

Codeforces Round #719 (Div. 3) A-E 题解

作者:互联网

F1 F2 有时间在补

A Do Not Be Distracted!

Do Not Be Distracted!
题意:给定一个只含有26个大写字母的字符串,每个大写字母表示一项工作,每项工作只能连续做或者前面做过就不能在做了,如果可以满足条件的话,则输出Yes,否则输出No.题目给的特殊情况直接输出Yes
思路:开map 按照题目模拟着做就可以了
时间复杂度:o tnlogn

#include<bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define re register int
typedef long long ll ;
using namespace std;
const int N =  1e6 + 10 , M = 1010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
int t ;
int n ;
string a ;
int main()
{
    cin >> t ;
    while(t--)
    {
        map<char,int> q ;
        q.clear() ; // 记得清空
        cin >> n ;
        cin >> a ;
        int f1 = 0 ;
        q[a[0]] ++ ;
        for(int i = 1 ; i < n ; i ++)
        {
            if(q[a[i]] && a[i] != a[i-1])  // 如果已经做过这项工作并且不是连续做的
            {
                f1 = 1 ;
                break;
            }
            q[a[i]] ++ ;
        }
        if(a == "FFGZZZY" || a == "BA" || a == "AFFFCC" || a == "YYYYY") puts("YES");
        else if(f1) puts("NO");
        else puts("YES") ;
    }
    return 0;
}

B Ordinary Numbers

Ordinary Numbers
题意:求从1到n中有多少个数字,满足它的每一位上的数字都相等
思路:n最大是1e9,从1到1e9中最多不超过90个数字满足它的每一位上的数字都相等,所以可以枚举这些数字,然后直接比较大小。
时间复杂度:o 90t

#include<bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define re register int
typedef long long ll ;
using namespace std;
const int N =  1e6 + 10 , M = 1010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
int a[N] = {0,9,18,27,36,45,54,63,72,81,90,99} ;
// 我这里打了个表  打不打表都可以
int main()
{
    int t ;
    cin >> t ;
    while(t--)
    {
        string s ;
        cin >> s ;
        int n = s.size() ;
        int res = a[n-1] ;
        // 枚举当前n位数的满足条件的数
        // 也可以枚举所有满足条件的数
        for(char i = '1' ; i <= '9' ; i ++)
        {
            string s1 = "" ;
            for(int j = 0 ; j < n ; j ++)
            {
                s1 += i ;
            }
            if(s >= s1) res ++ ;
        }
        cout << res << endl;
    }
    return 0;
}

C Not Adjacent Matrix

Not Adjacent Matrix
题意:给定一个数字n,要求是否可以输出一个n*n的距阵,满足这个距阵上的每一个数,都有与他相邻的四个数中相减的绝对值不等于1,并且这个距阵只由1到n方组成。如果可以满足,输出这个距阵,如果不行,输出-1
思路:只有n等于2的这种情况不满足,考虑一下偶数和奇数都相差不等于1的话,是不是可以1 3 5 7 9 .......2 4 6 8 10 .......这样依次填,然后我模拟了2 3 个数据发现是对的。
时间复杂度:o tn^2

#include<bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define re register int
typedef long long ll ;
using namespace std;
const int N =  1e6 + 10 , M = 1010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
int a[M][M] ;
int main()
{
	int t ;
	cin >> t ;
	while(t--)
	{
	    int n ;
	    cin >> n ;
	    int k = 1 ; // 奇数从一开始
	    fer(i,1,n)
	    {
	        fer(j,1,n)
	        {
	            a[i][j] = k ;
	            k += 2 ;
	            if(n & 1 && k == (n * n) + 2) k = 2 ;
	            if(n % 2 == 0 && k == (n * n - 1 + 2)) k = 2 ;
	            // 偶数从2开始
	        }
	    }
	    if(n == 2) puts("-1");
	    else
	    {
	        fer(i,1,n)
	        {
	            fer(j,1,n)
	                cout << a[i][j] << " " ;
	            cout << endl;
	        }   
	    }
	}
return 0;
}

D Same Differences

Same Differences
题意:给定一个有n个数的数组,求有多少对数字满足i < j 并且 a[j] - a[i] = j - i .
思路在这里插入图片描述
那么任选2个i < j 这个条件可以满足嘛 ,这个是一定可以满足的,因为排列组合中的C不带排序,
时间复杂度:o tn

#include<bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define re register int
typedef long long ll ;
using namespace std;
const int N =  1e6 + 10 , M = 1010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
int t ;
int n ;
int a[N] ;
unordered_map<int,int> q ; // map方便记录答案
int main()
{
    cin >> t ;
    while(t--)
    {
        cin >> n ;
        fer(i,1,n) scanf("%d",&a[i]);
        q.clear() ; // 记得清空
        fer(i,1,n)
            if(a[i] - i >= 0) q[a[i]-i] ++ ;  // 写不写if都可以
        ll res = 0 ;  // 一定要开long long 会爆int
        for(auto i : q)
        {
            ll m = i.second ;
            res += m * (m - 1) / 2 ;
        }
        cout << res << endl;
    }
    return 0;
}

E. Arranging The Sheep

Arranging The Sheep
题意:给定一个字符串,问最少需要多少步,把所有的星号移动到都相邻。
思路:只考虑如果是移动到同一个位置的话,直接每个数减去他们的中位数相加即可,现在是相邻,那我们只用给每个位置减去它们相对于中间的数的相对位移即可。
时间复杂度:otn

#include<bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define re register int
typedef long long ll ;
using namespace std;
const int N =  1e6 + 10 , M = 1010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
int t ;
char s[N] ;
ll b[N] ;
int main()
{
    int n ;
    cin >> t ;
    while(t--)
    {
        cin >> n ;
        cin >> s + 1 ;
        int k = 0 ;
        fer(i,1,n)
        {
            if(s[i] == '*') b[++ k] = i ; // 找到所有星星的位置
        }
        fer(i,1,k)
            b[i] -= i ;   // 减去偏移量
            
        ll res = 0 ;
        fer(i,1,k)
        {
            res += abs(b[i] - b[k/2+1]) ;  
        }
        cout << res << endl;
    }
    return 0;
}

我好兄弟的另外一种方法:dp
dp方法

标签:题意,int,题解,Codeforces,cin,++,fer,res,Div
来源: https://www.cnblogs.com/yueshehanjiang/p/14733670.html