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