Codeforces Round #719 (Div. 3) A-E
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #719 (Div. 3) A-E相关的知识,希望对你有一定的参考价值。
A
存下来每个字符出现的次数,如果当前字符与前面的字符不相同时,说明是一个新的开始,如果字符访问过,就为NO
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
int n,vis[200]{};
char s[55];
cin>>n>>s;
for(int i=0;i<n;++i)
{
if(i&&s[i]!=s[i-1]&&vis[s[i]])
{
cout<<"NO\\n";
return ;
}
vis[s[i]]++;
}
cout<<"YES\\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int _;cin>>_;
while(_--){
solve();
}
return 0;
}
B
非暴力:
统计输入的数的位数num
首先num-1的所有的数一定满足情况,每种位数的数都有9种
然后再考虑本位数的数,可以构造一个数为首尾相同而且位数相同的数,如果该数大于构造的数结果可以加上首位的数,否则结构加上首位的数再减去一。
坑:657 (没法666) 671 (可以666)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
ll n;cin>>n;
ll t = n,tt=n;
ll num = 0,ans = 0;
while(t){//统计位数
num += 1;
t/=10;
}
ans += (num-1)*9;
ll powe = 1;
for(int i=1;i<num;i++) powe*=10;
ans += tt/powe-1;
ll x=tt/powe;
for(int i=1;i<num;i++)
{
x = x*10+tt/powe;//构造与首位相同的位数相同的数
}
if(tt>=x) ans++;
cout<<ans<<'\\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int _;cin>>_;
while(_--)solve();
return 0;
}
暴力:(打表)
直接构造这样的数,最后比较即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int>vi;
vi v;
int main(){
ios::sync_with_stdio(0),cin.tie(0);
// freopen("1.txt","r",stdin);
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
int a=0;
for(int k=0;k<i;k++){
a=a*10+j;
}
v.push_back(a);
}
}
v.push_back(inf);
int _;cin>>_;
while(_--){
int a;cin>>a;
int ans=0;
for(auto i:v){
if(i<=a)ans++;
else break;
}
cout<<ans<<endl;
}
return 0;
}
C
n==2不满足情况
其他的n值均满足情况
第一次奇数行1 3 5…填数
偶数行2 4 6…填数
第二次奇数行2 4 6… 填数
偶数行 1 3 5…填数
上面的数字代表列号
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int g[105][105];
void solve()
{
int n;
cin>>n;
if(n==2)
{
cout<<-1<<"\\n";
return ;
}
int cur = 1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if((i&1)&&(j&1)) g[i][j] = cur++;
if((i%2==0)&&(j%2==0)) g[i][j] = cur++;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if((i&1)&&(j%2==0)) g[i][j] = cur++;
if((i%2==0)&&(j&1)) g[i][j] = cur++;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<g[i][j]<<" ";
}
cout<<"\\n";
}
}
int main()
{
int _;
cin>>_;
while(_--) solve();
return 0;
}
D
用map记录值与下标的差值,结构就是出现相同差值的次数中选两次 C(k,2)
为k*(k-1)/ 2,求和即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 2e5+5;
ll a[N];
void solve()
{
map<ll,ll>mp;
int n;cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
mp[a[i]-i]++;
}
ll ans = 0;
for(auto i : mp) ans += i.second*(i.second-1)/2;
cout<<ans<<'\\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int _;
cin>>_;
while(_--) solve();
return 0;
}
E
记录总的*的数量cnt
记录当前访问到的 * 的数量now
如果访问到 . 的话,最小的步数就是min(now,cnt-now),每个 . 都会加一下,代表左边的 * 或者右边的 * 移到该位置的最小步数 (类似dp思想)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+5;
char s[N];
void solve()
{
int n;cin>>n;
cin>>(s+1);
ll cnt = 0,now=0,ans=0;
for(int i=1;i<=n;i++) if(s[i]=='*')++cnt;
for(int i=1;i<=n;i++)
{
if(s[i]=='*') ++now;
else
ans += min(now,cnt-now);
}
cout<<ans<<'\\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int _;
cin>>_;
while(_--)solve();
return 0;
}
以上是关于Codeforces Round #719 (Div. 3) A-E的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #719 (Div. 3)Codeforces-1520ABCDE
Codeforces Round #719 (Div. 3) ABCDEF题解
Codeforces Round #719 (Div. 3) A-E
Codeforces Round #719 (Div. 3) A-G题解 G题详细注释