算法入门-贪心+数学逻辑

贪心

没有递交-P1223  排队接水
没有递交-A1320  【例6.2】均分纸牌(Noip2002)
没有递交-A1369  合并果子(fruit)
没有递交-A1323  【例6.5】活动选择
没有递交-A1324  【例6.6】整数区间
没有递交-P1108  「一本通 1.1 例 3」喷水装置
没有递交-P1109  「一本通 1.1 例 5」智力大冲浪

数学逻辑

没有递交-P8813  [CSP-J 2022] 乘方
没有递交-P7071  [CSP-J2020] 优秀的拆分
没有递交-P9748  [CSP-J 2023] 小苹果
没有递交-P5657  [CSP-S2019] 格雷码
没有递交-P7909  [CSP-J 2021] 分糖果
没有递交-P8814  [CSP-J 2022] 解密
没有递交-P5686  [CSP-S2019 江西] 和积和
没有递交-P7076  [CSP-S2020] 动物园
没有递交-P5682  [CSP-J2019 江西] 次大值
没有递交-P5684  [CSP-J2019 江西] 非回文串

[CSP-S2019] 格雷码 - 洛谷  看到题肯定是找规律

 #include<bits/stdc++.h>
using namespace std;
//const int maxn = 1E9;
int d[4] = {0,1,1,0};
#define ull unsigned long long 
int main(){
	ull n,k,one=1;
	cin>>n>>k;
	/*
	ull num=one<<(n-1);//如果直接写1<<(n-1)计算过程中就溢出了 
	for(int i=n-1;i>=0;i--,num>>=1){
		ull loop=k/num;
		int order=(int)(loop%4);
		printf("%d",d[order]);
	} 
	//从低到高位的特殊循环节 
	//0110第1位规律
	//00111100第2位规律 
  //i 01234567
//i/2 00112233   下标选择从0开始,/巧妙计算循环节,%4提取出来正好满足0110序列 
	//0000111111110000 第3位规律 
	*/
	for(int i=n-1;i>=0;i--){
		ull loop=k>>i;
		int order=loop&3;//3就是二进制的11,就是取后两位 
		printf("%d",d[order]);
	}
	return 0;
}

数据结构

数据结构的基本题型、经典题目。

要求:经过多次训练后,每一题都必须能快速、熟练地做完。

部分题目时间限制参考:ACWing - AC Saber - 训练模式 - 数据结构 的相似题目。

  • 字符、字符数组、C语言的字符串、C++ STL的string类的输入、输出、使用:第1~4题
  • 第5~8题:要求先用动态内存分配或数组手动实现一遍该数据结构,然后再用STL做一遍。
  • 树的存储与遍历:找树根和孩子,二叉树的遍历,二叉树深度
  • 图的存储与遍历、图的连通性:图的遍历(简单版)、查找文献、Cow Picnic、图的遍历(正常版)
  • 二叉堆(STL中的优先队列实现):合并果子
  • 并查集:亲戚,格子游戏,亲戚
  • 哈希与字符串哈希:门票,子串查找
  • 集合、字典、哈希表的STL实现:学籍管理,A-B数对(同时要求掌握使用STL相关函数的解法)

没有递交-A1137  加密的病历单
没有递交-A1144  单词翻转
没有递交-A1149  最长单词2
没有递交-P242  【例40.3】ISBN码
没有递交-B3631  单向链表
没有递交-B3614  【模板】栈
没有递交-B3616  【模板】队列
没有递交-B3656  【模板】双端队列 1
没有递交-A1336  【例3-1】找树根和孩子
没有递交-B3642  二叉树的遍历
没有递交-P4913  【深基16.例3】二叉树深度
没有递交-B3862  图的遍历(简单版)
没有递交-P5318  【深基18.例3】查找文献
没有递交-P2853  [USACO06DEC] Cow Picnic S
没有递交-P3916  图的遍历(正常版)
没有递交-A1369  合并果子(fruit)
没有递交-A1346  【例4-7】亲戚(relation)
没有递交-A1347  【例4-8】格子游戏
没有递交-A1389  亲戚
没有递交-A1  「一本通 2.1 练习 7」门票
没有递交-A2  子串查找
没有递交-P5266  【深基17.例6】学籍管理
没有递交-P1102  A-B 数对

 

位运算

没有递交-P1141  整数幂
没有递交-P1142  找数
没有递交-P1469  找筷子
没有递交-P1151  异或应用
没有递交-P1152  异或应用3
没有递交-P272  【例45.1】 高低位交换
没有递交-B3919  [语言月赛 202401] 二进制与一
没有递交-P9451  [ZSHOI-R1] 新概念报数
没有递交-P1143  拔河比赛
没有递交-P1144  乒乓比赛
没有递交-B3695  集合运算 3
没有递交-P2114  [NOI2014] 起床困难综合症

 拔河比赛

题目描述

1个学校举行拔河比赛,要求将所有的人分成两组,每个人必须(且只能够)在其中的一组,且两个组内的所有人体重加起来尽可能地接近。

【输入格式】 第一行一个正整数 n,表示参加拔河比赛的总人数。

接下来的 n行,每行一个正整数,表示第1到第n个人的体重 weight。

【输出格式】 一行两个正整数,分别是两个组的所有人的体重和,用一个空格隔开。注意如果这两个数不相等,则请把小的放在前面输出。

Samples

输入数据 1

3
100
90
200

Copy

输出数据 1

190 200
#include<bits/stdc++.h>
using namespace std;
const int maxs=5E5+10;//如果用二进制表示人员选择的排列组合有2^n种状态,枚举选择状态再求和会超时 
int n,w,w_sum=0,w_l;
bitset<maxs> bs(1);
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>w;
		w_sum+=w;
		bs=bs|(bs<<w);//利用位移和或模拟“加法”保留所有可能的中间状态,bs[i]状态位为1表示和为i的可能性存在 
		//cout<<bs<<endl;
	}
	for(int i=(w_sum>>1);i>=0;i--){
		if(bs[i]){
			cout<<i<<" "<<w_sum-i;
			return 0;
		}
	}
	return 0;
}

乒乓比赛

【问题描述】一条大街上住着n个乒乓球爱好者,经常组织比赛切磋技术。每个人都有一个不同的技能值a。每场比赛需要3个人:两名选手和一名裁判。他们有一个奇怪的规定,即裁判必须住在两名选手的中间,并且技能值也在两名选手之间。问一共能组织多少场不同的比赛。 【输入格式】 第1行1个正整数n。 第2行n个不同的整数a1,a2,...,ana1​,a2​,...,an​为按照住处从左到右的顺序给出的每个乒乓球爱好者的技能值。 【输出格式】 一行一个整数,表示比赛的总场数。 

//本来以为可以前缀和,结果裁判还必须住中间,那涉及单点修改区间查询了得线段树之类的。
//树状数组求单点修改后的区间和最简洁
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&-x
#define ll long long
ll a[200010],c[200010],lmin[200010],rmax[200010],lmax[200010],rmin[200010];
void add(int x) {
	for (;x<200010; x+=lowbit(x)) c[x]++;
}
ll ask(int x) {
	ll ans=0;
	for (; x>0; x-=lowbit(x)) ans+=c[x];
	return ans;
}
int main() {
	ll n;
	cin>>n;
	for (int i=1; i<=n; i++) cin>>a[i], lmin[i]=lmax[i]=rmin[i]=rmax[i]=0;
	for (int i=1; i<=n; i++) {
		ll l=ask(a[i]);
		lmin[i]=l;
		lmax[i]=i-l-1;
		add(a[i]);
	}
	memset(c,0,sizeof c);
	for (int i=n,j=1;i>0;i--,j++) {
		ll r=ask(a[i]);
		rmin[i]=r;
		rmax[i]=j-r-1;
		add(a[i]);
	}
	ll ans=0;
	for (int i=1; i<=n; i++) {
		ans+=lmin[i]*rmax[i];
		ans+=lmax[i]*rmin[i];
	}
	cout<<ans<<'\n';
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值