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题详细注释

Codeforces Round #719 (Div. 3) A-G题解 G题详细注释

Codeforces Round #719 (Div. 3) A-G题解 G题详细注释