codeforces1257

部署运行你感兴趣的模型镜像

A.

题意:一共n个点,有俩点叫a b,可以进行m次交换操作,问最大ab点相距多少。

水题

#include<iostream>
#include<cmath>
using namespace std;
int min(int a,int b){
	return a<b?a:b;
}
int main(){
	int t;
	int n,m,a,b;
	cin>>t;
	while(t--)
	{
		cin>>n>>m>>a>>b;
        int dis=abs(a-b);
		int ans=min(dis+m,n-1);
		cout<<ans<<endl;
	}

}

B做过了

C.

题意:给n个数,求这之中两个相同的数字最小距离是多少

思路:题意挺简单的,但是理解题意的时候可费劲了,他叙述的跟多复杂一样,什么dominated by,根本就看不懂,明明就是这点事,英语还是要好好学,一开始的做法还挺复杂的,就是想着一点点处理,但是wa了,看不出来哪里错了,然后改了个思路,用一个vis数组表示每个数是否输入过并且表示他最后一次出现的位置,每次输入的时候,如果之前没有输入过,就把vis设为当前的位置,输入过就求距离比较,找到最小的。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
typedef long int ll;

int a[200005],vis[200005];
int main()
{
	int t;
	int n,i,j;
	
	cin>>t;
	while(t--)
	{
        memset(vis,0,sizeof(vis));
		cin>>n;
		int ans=inf;
		int flag=0;
		for(i=1;i<=n;i++)
		{
			cin>>a[i];
			if(vis[a[i]]==0) vis[a[i]]=i;
			else{
			flag=1;
			if(abs(vis[a[i]]-i)<ans) ans=abs(vis[a[i]]-i);
			vis[a[i]]=i;
			}
		}
		if(flag)
		cout<<ans+1<<endl;
        else
	    cout<<-1<<endl;
	}
		 
	return 0;
}

D.

题意:有丶复杂,你有m个英雄,每个英雄有力量值和耐力值,然后按顺序要打n个怪兽,每个怪兽也有力量值,如果英雄的力量值大于等于怪兽就可以干掉他,在一天中会消耗掉他的一个耐力值,问你最少可以用多少天来弄死所有怪兽。

思路:自己想的时候忽略了一个点,就是每个英雄不只可以用一次,因为他在战斗后休息一天,耐力值会回复满,这点错了,导致思路有点乱,按每个英雄处理,看每个英雄应该放在什么地方最好,但是会涉及很多问题,太复杂了。比赛的时候时间也不是很多了就没有继续往下做,看到了别人的题解之后就又懂了。用简单的贪心就能做,用一个数组suf[i]表示,耐力值大于等于i的英雄最大的力量是多少。然后从左向右对怪兽进行直接处理,有了一个suf数组就可以直接处理了,贪心思想就是在每个地方能用的英雄的最大耐力是多少,用一个maxx表示接下来要面对的怪兽力量是多少。这样一看,这思路挺简单的。

#include<iostream>
using namespace std;
const int maxn=2e5+10;
int n,m;
int a[maxn];
int suf[maxn],b[maxn];
int   p[maxn],s[maxn];
int main()
 {
     int t,i,j;
	 cin>>t;
	 while(t--){
	      cin>>n;
     for(i=1;i<=n;i++) b[i]=-1;
     for(i=1;i<=n;i++) cin>>a[i];
	      cin>>m;
		  for(i=1;i<=m;i++) {
			  cin>>s[i]>>p[i];
			  if(b[s[i]]<p[i]) b[s[i]]=p[i];
		  }
		  suf[n+1]=-1;
		  for(i=n;i>0;i--) suf[i]=max(suf[i+1],b[i]);
		  int pis=1,ans=0;
		  while(pis<=n)
		  {
			  int cnt=pis;
			  int maxx=a[pis];
			  while(cnt<=n&&suf[cnt-pis+1]>=maxx){
				  cnt++;
				  maxx=max(maxx,a[cnt]);
			  }
			  if(cnt==pis){ans=-1;break;}
			  ans++;
			  pis=cnt;
		  }
		  cout<<ans<<endl;
	 }

}

E.

题意:三个人,每个人掌握着几个数,三人一共掌握1到n n个数,问你怎样怎样用最小的操作数达到,三人分别掌握1到i,i+1到j,j+1到n几个数。

思路:处理前缀和,用cnt数组分别表示三人前i个数中有几个数,具体的推导还是看的别人作得。

#include <bits/stdc++.h>
 
#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define LL long long
using namespace std;
const int maxn = (ll) 2e5 + 5;
const int mod = 1000000007;
const int inf = 0x3f3f3f3f;
int cnt1[maxn], cnt2[maxn], cnt3[maxn];
int minn[maxn];
vector<int> v1, v2, v3;
 
int main() {
    start;
    int k1, k2, k3;
    cin >> k1 >> k2 >> k3;
    v1.resize(k1 + 5);
    v2.resize(k2 + 5);
    v3.resize(k3 + 5);  
    for (int i = 1; i <= k1; ++i) {
        cin >> v1[i];
        ++cnt1[v1[i]];
    }
    for (int i = 1; i <= k2; ++i) {
        cin >> v2[i];
        ++cnt2[v2[i]];
    }
    for (int i = 1; i <= k3; ++i) {
        cin >> v3[i];
        ++cnt3[v3[i]];
    }
    int n = k1 + k2 + k3;
    for (int i = 1; i <= n; ++i) {
        cnt1[i] = cnt1[i - 1] + cnt1[i];
        cnt2[i] = cnt2[i - 1] + cnt2[i];
        cnt3[i] = cnt3[i - 1] + cnt3[i];
    }
    for (int i = 0; i <= n; ++i)
        minn[i] = cnt3[i] - cnt2[i];
    for (int i = n - 1; i >= 0; --i)
        minn[i] = min(minn[i + 1], minn[i]);
    int ans = inf;
    for (int i = 0; i <= n; ++i) {
        int t = cnt2[i] - cnt1[i] + minn[i] + cnt1[n] + cnt2[n];
        ans = min(ans, t);
    }
    cout << ans;
    return 0;
}

F.

题意:给n个数,每个数给用一个x异或操作,让他们最后得到的二进制数1的个数相同,问这个数是多少。

思路:我见过这题,我记得是c题,当时补题的时候就没看懂,没想到这么快就遇到了,该学的还是要早点学啊,相似度这么高的题都做不出来确实是不应该。

#include <bits/stdc++.h>
#define LL long long
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define dep(i, j, k) for(int i = k; i >= j; i--)
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define mem(i, j) memset(i, j, sizeof(i))
#define pb push_back
using namespace std;
int ans = -1, n;
map < vector< int >, int > mp;
vector< int > Q;
int a[105];
void dfs1(int num, int statu){
    if(num > 15) {
        Q.clear();
        for(int i = 1; i <= n; i++) {
            Q.push_back(__builtin_popcount((statu ^ a[i]) % (1 << 15)));
        }
        for(int i = 1; i < n; i++) {
            Q[i - 1] = Q[i] - Q[i - 1];
        }
        Q.pop_back();
        if(!mp[Q]) mp[Q] = statu;
        return ;
    }
    dfs1(num + 1, statu);
    dfs1(num + 1, statu | (1 << (num - 1)));
}
void dfs2(int num, int statu) {
    if(num > 15) {
        Q.clear();
        for(int i = 1; i <= n; i++){
            ///__builtin_popcount(x) 用于计算x的二进制位上1的个数。
            Q.push_back(__builtin_popcount(statu ^ (a[i] >> 15)));
        }
        for(int i = 1; i < n; i++) {
            Q[i - 1] = -1 * (Q[i] - Q[i - 1]);
        }
        Q.pop_back(); /// 弹出最后一个元素。
        if(mp[Q]) {
            ans = mp[Q] | (statu << 15);
        }
        return ;
    }
    dfs2(num + 1, statu);
    dfs2(num + 1, statu | (1 << (num - 1)));
}
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    dfs1(1, 0); dfs2(1, 0);
    printf("%d\n", ans);
    return 0;
}

 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
### Codeforces 平台概述 Codeforces 是一个广受认可的在线编程竞赛平台,专注于算法竞技与程序设计能力提升[^1]。该平台由俄罗斯萨拉托夫州立大学的 Mike Mirzayanov 创建,自 2010 年上线以来已成为全球最具影响力的编程竞赛网站之一。 ### 编程竞赛机制 平台上定期举行名为 “Codeforces Round” 的定时竞赛,通常每两周一次,每次持续两小时左右。比赛采用分等级制度(Div. 1 和 Div. 2),根据参赛者当前 Rating 进行划分,确保公平竞争环境[^7]。近年来也推出了更灵活的比赛形式,如 Educational Rounds、Global Rounds 及 Team Contests,进一步丰富了赛事生态[^8]。 竞赛题目一般设置为 5 到 7 道不等,按难度递增标记为 A 至 G 级别。其中 A 题为基础模拟或贪心类问题,适合初学者;B/C 类常考察构造逻辑或多步推理;D/E 题则深入图论、动态规划、数论等领域;F/G 多用于高级技巧如复杂数据结构组合、概率期望推导等[^9]。 ```cpp // 示例:简单实现快速幂取模——常见于处理大指数运算场景 long long mod_pow(long long base, long long exp, long long mod) { long long result = 1; while (exp > 0) { if (exp & 1) result = (result * base) % mod; base = (base * base) % mod; exp >>= 1; } return result; } ``` ### 在线判题系统运作方式 提交代码后,系统会自动运行预设测试用例并返回反馈状态,包括 Accepted (AC)、Wrong Answer (WA)、Time Limit Exceeded (TLE)、Memory Limit Exceeded (MLE) 等结果码[^10]。评测基于 GNU C++ 编译器标准(常用 g++-x.x)、内存限制(通常 256MB)和时间约束(多数单测 ≤2 秒)。选手需注意输入输出效率优化,推荐使用 `scanf/printf` 或关闭同步流 (`ios::sync_with_stdio(false);`) 提升性能[^11]。 ### 算法题目特点与解题策略 Codeforces 的题目强调思维训练而非工程实践,典型考点覆盖: - **基础算法**:二分查找、前缀和、差分数组 - **经典结构**:栈、队列、优先队列、哈希表 - **高阶主题**:树状数组(BIT)、线段树、LCA 查询、网络流 部分难题融合多个知识点,例如 [Problem 1601F - Two Sorts] 要求结合排序理论与 ST 表技术,在离散化后的序列上维护区间最值映射关系,并考虑偏移量加减对位置索引的影响[^3]。 这类综合型挑战推动参与者掌握跨领域建模技能,同时也促进 STL 容器熟练运用与底层原理理解。 ### 社区影响与发展现状 截至近年统计数据显示,Codeforces 注册用户已突破百万级,来自超过 200 个国家和地区。其举办的 ICPC 训练营合作项目、Google Kick Start 前哨赛联动等活动显著提升了国际间青少年计算机教育互动频率[^12]。知名高校如 MIT、Stanford 将其作为选拔 ACM 国际队伍的重要参考依据之一。 活跃度方面,Top Rated 用户长期保持高强度刷题节奏,最高 Rating 曾达 4000+(tourist 保持历史纪录多年),反映出顶尖群体的技术沉淀强度[^13]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值