牛客周赛 Round 91(个人C++题解)

目录

A.while

B.token

C.小苯的逆序对和

D.数组4.0

E.小苯的矩阵反转

F.小苯的因子查询


A.while

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
string t="while";
void solve(){
	string s;
	cin>>s;
	int res=0;
	for(int i=0;i<s.size();i++){
		if(t[i]!=s[i]) res++;	//比较不同的,++
	}
	cout<<res<<endl;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int _=1;
	//cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

B.token

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int N = 1e5+7;
int a[N];
void solve(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int sum=0;
	if(n<=10){	//n小于等于10,所有ai之和为最优解
		for(int i=1;i<=n;i++){
			sum+=a[i];
		}
	}else{
		for(int i=10;i<=n;i++){	//每10位进行一次计算
			int tmp=0;
			for(int j=i-9;j<=i;j++){
				tmp+=a[j];
			}
			sum=max(sum,tmp);
		}
	}
	cout<<sum<<endl;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int _=1;
	//cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

C.小苯的逆序对和

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int N = 2e5+7;
int a[N];
void solve(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int res=0,l=a[1];		//l记录ai
	for(int j=2;j<=n;j++){	//枚举aj
		if(l>a[j]){			//ai>aj
			res=max(res,l+a[j]);	//更新最大结果
		}else{
			l=max(l,a[j]);	//更新最大aj
		}
	}	
	cout<<res<<endl;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int _=1;
	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

D.数组4.0

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
void solve(){
	int n;
    cin>>n;
    unordered_map<int, int> mp;
    for(int i=0;i<n;i++){
        int x;cin>>x;
        mp[x]++;
    }
    vector<int> a;	//记录出现的数(已去重)
    for(auto& p : mp) a.push_back(p.first);
    sort(a.begin(),a.end());	//排序
    
    int res = 0, m = a.size();
    int l = a[0], tmp = mp[l];
    bool f = false;
    for (int i = 1; i < m; i++) {
        if(a[i]==l+1) f = true;	//连续
        else{	//不连续
            if (!f) res += tmp;	//上一步不连通,要保整上一步所有的值与当前值连通
            else res += 1;	//上一步连通,只需加一条边保持连通
            tmp = mp[a[i]];
            f = false;
        }
        l=a[i];
    }
    if(!f) res += tmp;	//考虑最后值的连通情况
    else res += 1;
    cout << res - 1 << endl;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int _=1;
	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

E.小苯的矩阵反转

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
void solve(){
	int n,m;
	cin>>n>>m;
	vector<int> r(n+1,0),c(m+1,0);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char x;
			cin>>x;
			r[i]+=(x=='1');	//每行1的数量
			c[j]+=(x=='1');	//每列1的数量
		}
	}
	unordered_map<int,int> mpr,mpc;
	for(int i=1;i<=n;i++){
		mpr[r[i]]++;	
	}
	for(int i=1;i<=m;i++){
		mpc[c[i]]++;
	}
	if(mpr[0]==n	//(相同行或相同列)每行1出现数量为0的行数为n,YES
	//(不同的两行)每行1出现数量为0的行数为n-2,每行1出现数量为m的行数为2,YES
	||(mpr[0]==n-2&&mpr[m]==2)
	//(不同的两列)每列1出现数量为0的列数为m-2,每列1出现数量为n的列数为2,YES
	||(mpc[0]==m-2&&mpc[n]==2)
	/*(一行一列)每行1出现数量为1的行数为n-1,每行1出现数量为m-1的行数为1,
	每列1出现数量为1的列数为m-1,每列1出现数量为n-1的列数为1,YES*/
	||(mpr[1]==n-1&&mpr[m-1]==1&&mpc[1]==m-1&&mpc[n-1]==1)
	) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;	//其余情况为NO
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int _=1;
	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

F.小苯的因子查询

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int MOD = 998244353;
const int MAX_N = 1e6;
 /*
 (n!可以表示为2^v2 * m,其中m是奇数。
那么n!的因子总数是(v2 + 1) * t,其中t是m的因子个数。
而奇数因子的个数就是t。所以概率就是 t / [(v2 +1)*t] = 1/(v2 +1)
。哦,对,这样概率就是1/(v2 +1)。那现在问题转化为计算v2 +1)
*/
vector<int> init() { 	//预处理每个n的v2+1
    vector<int> v(MAX_N + 1, 0);
    for (int n = 1; n <= MAX_N; ++n) {
        int cnt = 0;
        int x = n;
        while (x) {
            cnt += x / 2;
            x /= 2;
        }
        v[n] = cnt + 1;
    }
    return v;
}
// 快速幂求逆元
int mod_pow(int base, int exp, int mod) {
    int result = 1;
    base %= mod;
    while (exp > 0) {
        if (exp % 2 == 1) {
            result = (result * base) % mod;
        }
        base = (base * base) % mod;
        exp /= 2;
    }
    return result;
}
void solve(){
	vector<int> v = init();
    int T;
    cin >> T;
    vector<int> a(T);
    for (int i = 0; i < T; ++i) {
        cin >> a[i];
    }
    for (int i = 0; i < T; ++i) {
        int n = a[i];
        int inv = mod_pow(v[n], MOD - 2, MOD);	//求逆元
        cout << inv << " ";
    }
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int _=1;
	//cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

### 关于周赛 Round 80 的相关信息 目前并未找到具体针对周赛 Round 80 的官方题解或比赛详情文档。然而,基于以往的比赛模式和惯例[^1],可以推测出此类赛事通常包含若干算法题目,覆盖基础数据结构、动态规划、贪心策略以及图论等领域。 #### 可能涉及的内容范围 1. **签到题 (A 题)** 这类题目一般较为简单,旨在测试选手的基础编程能力。例如简单的数学计算或者字符串处理问题。 2. **中级难度题 (B 到 D 题)** 中级难度的题目往往需要一定的算法设计能力和复杂度分析技巧。比如: - 动态规划优化问题; - 贪心算法的应用场景; - 图遍历与最短路径求解; 3. **高阶挑战题 (E 或更高)** 对于更复杂的题目,则可能涉及到高级的数据结构操作(如线段树、并查集)、组合数学推导或者其他领域内的难题解决方法。 以下是根据过往经验给出的一个假设性的例子来展示如何解答类似的竞赛问题: ```python def solve_example_problem(n, m): """ 假设这是一个关于矩阵填充的问题, 给定 n 行 m 列大小的空间,按照某种规则填充值。 参数: n -- 矩阵行数 m -- 矩阵列数 返回值: result_matrix -- 完成后的二维列表形式的结果矩阵 """ # 初始化结果矩阵为全零状态 result_matrix = [[0]*m for _ in range(n)] value_to_fill = 1 direction_changes = [(0,1),(1,0),(0,-1),(-1,0)] # 方向变化顺序:右->下->左->上 current_direction_index = 0 row,col=0,0 while True: try: if not(0<=row<n and 0<=col<m): raise IndexError() if result_matrix[row][col]==0: result_matrix[row][col]=value_to_fill value_to_fill+=1 next_row,next_col=row+direction_changes[current_direction_index%len(direction_changes)][0],\ col+direction_changes[current_direction_index%len(direction_changes)][1] if any([not(0<=next_row<n), not(0<=next_col<m), bool(result_matrix[next_row][next_col])]): current_direction_index +=1 else: row,col=next_row,next_col except Exception as e: break return result_matrix if __name__ == "__main__": test_result=solve_example_problem(4,5) for line in test_result: print(line) ``` 上述代码片段展示了如何通过模拟实现一个螺旋状填充整数值至指定尺寸矩形中的过程作为示范案例之一[^4]。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值