前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Codeforces Round #674 (Div. 3) A ~ F 详细讲解

Codeforces Round #674 (Div. 3) A ~ F 详细讲解

作者头像
杨鹏伟
发布2020-10-10 09:38:52
2610
发布2020-10-10 09:38:52
举报
文章被收录于专栏:ypwypwypw

A

思路+题意:就是除了第一层有两个单元的话,其余的楼层都有x个单元。自己动手推一推就知道了。然后就是取余跟做除,看看在当前这层,还是下一层。不要忘了 加上第一层。

#include<bits/stdc++.h>
 
using namespace std;
 
int main(){
	int t;
	cin>>t;
	while(t--){
		int n,x;
		cin>>n>>x;
		if(n == 1 || n==2 ){
			cout<<"1"<<endl;
			continue;
		}
		else{
			if(x==1){
				cout<<n-1<<endl;
				continue;
			}
			else{
				int res = n - 2;
				int tot = res/x;
				int ans = res % x;
				if(ans == 0){
					cout<<1 + tot<<endl;
				}
				else{
					cout<<2+tot<<endl; 
				}
			}
		}
	}
	return 0;
} 

B 题意 + 思路:就是让你求一个矩阵关于主对角线对称。那么就是小矩阵的左下角跟右上角一样就行了。自己推一推。 然后大矩阵还必须是偶数的。这样子就行了。

#include<bits/stdc++.h>
 
using namespace std;
int a[5][5];
 
int main(){
	int t;
	cin>>t;
	while(t--){
		int n,m;
		cin>>n>>m;
		bool flag=0;
	
			for(int i=1;i<=n;i++){
				
			
			for(int j=1;j<=2;j++){
				for(int k=1;k<=2;k++){
					cin>>a[j][k];
				}
			}
			if(a[2][1] == a[1][2]) flag = 1;
			//cout<<flag<<endl;
		
	}
		if(m%2==0 && flag) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

C 题意 + 思路: 就是给你两个操作,一个是可以对序列选定的一个数 + 1,一个是对序列进行赋值加到当前序列。问你大于等于n至少需要多少次。然后我们就是枚举 +1即操作一的次数,然后这个时候看操作二要复制多少次才能>=n,然后我们维护跟新最小值就行。开到根号n就行了。

#include<bits/stdc++.h>
 
using namespace std;
 
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		int ans = n;
		for(int i=2;i*i<=n;i++){
			if(n%i==0){
				ans = min(ans,i-1+n/i);
			}
			else{
				ans = min(ans,i-1+n/i+1);
			}
		}
		ans--;
		cout<<ans<<endl;
	}
	return 0;
}

D 题意 + 思路:就是给你一个序列,然后让任意子序列和不为 0 。那么我们首先肯定写个前缀和!,然后呢?我们思考,如果一个区间和 为 0 ,然后我们在右端点左边 加入一个无穷大的值,那么这个时候就相当于加入这个值左面的子区间肯定不为 0了,所以就相当于一个新的前缀和从右端点开始的,如此循环模拟,得到最少插入次数。

include<bits/stdc++.h>
#define maxn 200005
using namespace std;
typedef long long ll;
ll a[maxn],sum[maxn];

set<ll> s;
int tot = 0;
ll temp = 0;
int main(){
	ll n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	} 
	for(int i=1;i<=n;i++){
		sum[i] = sum[i-1]+a[i];
	}
	for(int i=0;i<=n;i++){
		if(!s.count(sum[i]-temp)) s.insert(sum[i]-temp);
		else{
			tot++;
			s.clear();
			s.insert(0);
			s.insert(a[i]);
			temp = sum[i-1];
		}
	}
	cout<<tot<<endl;
	return 0;
}

E 题意 + 思路:就是石头剪刀布卡片若干 两个人博弈,数目不一样,然后让你求自己赢的最多的次数跟赢的最少的次数,赢的最好就是让自己去赢就行了,赢的最少的话就是平局让对面赢,然后最后迫不得已了让自己再赢。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;

ll a[10];
ll b[10];

int main(){
	ll n;
    cin>>n;
    for(int i=1;i<=3;i++){
    	cin>>a[i];
	}
	for(int i=1;i<=3;i++){
		cin>>b[i];
	}
	ll tot = 0;//就让自己赢最多 
	a[1] >= b[2] ? tot+=b[2]:tot+=a[1];
	a[2] >= b[3] ? tot+=b[3]:tot+=a[2];
	a[3] >= b[1] ? tot+=b[1]:tot+=a[3];
	
	
	
	
	ll to =0;//尽量平局然后让对方赢自己。 
    ll a1=0,a2=0,a3=0,b1=0,b2=0,b3=0;
    ll aa1=0,aa2=0,aa3=0;//存下平局跟输的 
    if(a[2] - b[1] -b[2] > 0){
    	aa2 = (a[2]-b[1]-b[2]);
	}
	ans = min(ans,aa2);
	if(a[1] - b[1] - b[3] >0){
		aa1 = (a[1]-b[1]-b[3]);
	}
	ans = min(ans,aa1);
	if(a[3] - b[3] -b[2] >0){
		aa3 =(a[3] - b[3]-b[2]);
	}
    to = aa1+aa2+aa3; 
	cout<<to<<" "<<tot<<endl; 
	return 0;
}

F 题意 + 思路:就是“?”可以改成 a ,b,c。然后让求abc的个数。模拟这个过程然后暴力即可。

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 2e5 + 5, mod = 1e9 + 7;
 
int n, m, _, k;
char s[N];
ll a[20], ans = 0;
 
int qpow(ll a, ll b) {
    ll ans = 1; a %= mod;
    for (; b; a = a * a % mod, b >>= 1)
        if (b & 1) ans = ans * a % mod;
    return ans;
}
 
int main() {
    cin >> n;
    cin >> s + 1;
    for(int i=0;i<n;i++)

        if (s[i] == 'a') ++a[1];
        else if (s[i] == 'b') {
            a[3] += a[1];
            a[5] += a[2];
        } else if (s[i] == 'c') {
            a[7] += a[3];
            a[9] += a[4];
            a[10] += a[5];
            a[13] += a[6];
        } else {
            a[14] += a[6];
            a[12] += a[5];
            a[11] += a[4];
            a[8] += a[3];
            a[6] += a[2];
            a[4] += a[1];
            ++a[2];
        }
    if (a[7]) ans = a[7] % mod * qpow(3, a[2]) % mod;
    if (a[8]) ans = (ans + a[8] % mod * qpow(3, a[2] - 1) % mod) % mod;
    if (a[9]) ans = (ans + a[9] % mod * qpow(3, a[2] - 1) % mod) % mod;
    if (a[10]) ans = (ans + a[10] % mod * qpow(3, a[2] - 1) % mod) % mod;
    if (a[11]) ans = (ans + a[11] % mod * qpow(3, a[2] - 2) % mod) % mod;
    if (a[12]) ans = (ans + a[12] % mod * qpow(3, a[2] - 2) % mod) % mod;
    if (a[13]) ans = (ans + a[13] % mod * qpow(3, a[2] - 2) % mod) % mod;
    if (a[14]) ans = (ans + a[14] % mod * qpow(3, a[2] - 3) % mod) % mod;
    cout << ans;
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档