贪心
没有递交 | - | P1223 排队接水 |
没有递交 | - | A1320 【例6.2】均分纸牌(Noip2002) |
没有递交 | - | A1369 合并果子(fruit) |
没有递交 | - | A1323 【例6.5】活动选择 |
没有递交 | - | A1324 【例6.6】整数区间 |
没有递交 | - | P1108 「一本通 1.1 例 3」喷水装置 |
没有递交 | - | P1109 「一本通 1.1 例 5」智力大冲浪 |
数学逻辑
[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;
}