noi-2026年5月05号作业
2026/5/8 17:14:12 网站建设 项目流程

题目:P1093 [NOIP 2007 普及组] 奖学金

网址:https://www.luogu.com.cn/problem/P1093

思路:按照题目的意思进行模拟,先按照总分排序,再安排语文的分数排序,再按照学号排序。

知识点:sort函数的使用,自定义排序函数。

代码:

#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define pss pair<string,string> #define fi first #define se second #define pb push_back #define eb emplace_back #define pbb pair<bool,bool> #define un unsigned #define ull unsigned long long #define int_INF 0x3f3f3f3f #define LL long long #define ll_INF 0x3f3f3f3f3f3f3f3f #define lb long double #define db double #define re return #define pll pair<ll,ll> #define mp make_pair #define eb emplace_back #define all(x) (x).begin(),(x).end() #define debug(a) cout<<"debug: "<<(#a)<<" = "<<a<<'\n' #define cer(a) cerr<<#a<<'='<<(a)<<"@ line"<<__LINE__<<endl #define cer2(a,b) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<"@ line"<<__LINE__<<endl #define cer3(a,b,c) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<','<<#c<<'='<<(c)<<','<<"@ line"<<__LINE__<<endl #define pdd pair<db,db> #define Yes cout<<"Yes"<<'\n' #define No cout<<"No"<<'\n' #define KV(x) #x << " = " << x << ";" #define DEBUG DebugLine(__LINE__) #define bitCount(x) __builtin_popcount(x) #define i128 __int128 using namespace std; const int maxn=3e5+100; const ll mode=998244353; const ll mode2=1e9+7; const ll inf=9223372036854775807; const db eps=1e-6; ll n,m; ll sum,ans; string str; vector<int>vt; int vis[maxn]; struct node{ ll id,chinese,s; }a[maxn]; bool cmp(const node&n1,const node&n2) { if(n1.s!=n2.s) return n1.s>n2.s; if(n1.chinese!=n2.chinese) return n1.chinese>n2.chinese; return n1.id<n2.id; } void solve() { cin>>n; for(int i=1;i<=n;i++) { a[i].id=i; a[i].s=0; for(int j=1;j<=3;j++) { ll x; cin>>x; if(j==1) a[i].chinese=x; a[i].s+=x; } } sort(a+1,a+1+n,cmp); for(int i=1;i<=5;i++) { cout<<a[i].id<<" "<<a[i].s<<'\n'; } } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int _; _=1; // cin>>_; while(_--) solve(); return 0; /* 1.深呼吸,不要紧张,慢慢读题,读明白题,题目往往比你想的简单。 2.暴力枚举:枚举什么,是否可以使用一些技巧加快枚举速度(预处理、前缀和、数据结构、数论分块)。 3.贪心:需要排序或使用数据结构(pq)吗,这么贪心一定最优吗。 4.二分:满足单调性吗,怎么二分,如何确定二分函数返回值是什么。 5.位运算:按位贪心,还是与位运算本身的性质有关。 6.数学题:和最大公因数、质因子、取模是否有关。 7.dp:怎么设计状态,状态转移方程是什么,初态是什么,使用循环还是记搜转移。 8.搜索:dfs 还是 bfs ,搜索的时候状态是什么,需要记忆化吗。 9.树上问题:是树形dp、树上贪心、或者是在树上搜索。 10.图论:依靠什么样的关系建图,是求环统计结果还是最短路。 11.组合数学:有几种值,每种值如何被组成,容斥关系是什么。 12.交互题:log(n)次如何二分,2*n 次如何通过 n 次求出一些值,再根据剩余次数求答案。 13.如果以上几种都不是,多半是有一个 point 你没有注意到,记住正难则反。 */ }

题目:P5143 攀爬者

网址:https://www.luogu.com.cn/problem/P5143

思路:因为一个高度只有一个点,所有我们排序之后直接模拟就行。

知识点:sort函数的使用,自定义排序函数。

代码:

#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define pss pair<string,string> #define fi first #define se second #define pb push_back #define eb emplace_back #define pbb pair<bool,bool> #define un unsigned #define ull unsigned long long #define int_INF 0x3f3f3f3f #define LL long long #define ll_INF 0x3f3f3f3f3f3f3f3f #define lb long double #define db double #define re return #define pll pair<ll,ll> #define mp make_pair #define eb emplace_back #define all(x) (x).begin(),(x).end() #define debug(a) cout<<"debug: "<<(#a)<<" = "<<a<<'\n' #define cer(a) cerr<<#a<<'='<<(a)<<"@ line"<<__LINE__<<endl #define cer2(a,b) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<"@ line"<<__LINE__<<endl #define cer3(a,b,c) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<','<<#c<<'='<<(c)<<','<<"@ line"<<__LINE__<<endl #define pdd pair<db,db> #define Yes cout<<"Yes"<<'\n' #define No cout<<"No"<<'\n' #define KV(x) #x << " = " << x << ";" #define DEBUG DebugLine(__LINE__) #define bitCount(x) __builtin_popcount(x) #define i128 __int128 using namespace std; const int maxn=3e5+100; const ll mode=998244353; const ll mode2=1e9+7; const ll inf=9223372036854775807; const db eps=1e-6; ll n,m; ll sum,ans; string str; vector<int>vt; int vis[maxn]; struct node{ db x,y,z; }a[maxn]; bool cmp(const node&n1,const node&n2) { return n1.z<n2.z; } db cal(db x1,db y1,db z1,db x2,db y2,db z2) { db v=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)); return v; } void solve() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i].x>>a[i].y>>a[i].z; } db res=0; sort(a+1,a+1+n,cmp); for(int i=2;i<=n;i++) { res+=cal(a[i-1].x,a[i-1].y,a[i-1].z,a[i].x,a[i].y,a[i].z); } cout<<fixed<<setprecision(3)<<res; } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int _; _=1; // cin>>_; while(_--) solve(); return 0; /* 1.深呼吸,不要紧张,慢慢读题,读明白题,题目往往比你想的简单。 2.暴力枚举:枚举什么,是否可以使用一些技巧加快枚举速度(预处理、前缀和、数据结构、数论分块)。 3.贪心:需要排序或使用数据结构(pq)吗,这么贪心一定最优吗。 4.二分:满足单调性吗,怎么二分,如何确定二分函数返回值是什么。 5.位运算:按位贪心,还是与位运算本身的性质有关。 6.数学题:和最大公因数、质因子、取模是否有关。 7.dp:怎么设计状态,状态转移方程是什么,初态是什么,使用循环还是记搜转移。 8.搜索:dfs 还是 bfs ,搜索的时候状态是什么,需要记忆化吗。 9.树上问题:是树形dp、树上贪心、或者是在树上搜索。 10.图论:依靠什么样的关系建图,是求环统计结果还是最短路。 11.组合数学:有几种值,每种值如何被组成,容斥关系是什么。 12.交互题:log(n)次如何二分,2*n 次如何通过 n 次求出一些值,再根据剩余次数求答案。 13.如果以上几种都不是,多半是有一个 point 你没有注意到,记住正难则反。 */ }

题目:P1068 [NOIP 2009 普及组] 分数线划定

网址:https://www.luogu.com.cn/problem/P1068

思路:按照题目意思进行模拟,先只按照分数从大到小排序,获得面试分数线和进面人数之后,再按照分数、学号进行排序。

知识点:sort函数的使用,自定义排序函数。

代码:

#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define pss pair<string,string> #define fi first #define se second #define pb push_back #define eb emplace_back #define pbb pair<bool,bool> #define un unsigned #define ull unsigned long long #define int_INF 0x3f3f3f3f #define LL long long #define ll_INF 0x3f3f3f3f3f3f3f3f #define lb long double #define db double #define re return #define pll pair<ll,ll> #define mp make_pair #define eb emplace_back #define all(x) (x).begin(),(x).end() #define debug(a) cout<<"debug: "<<(#a)<<" = "<<a<<'\n' #define cer(a) cerr<<#a<<'='<<(a)<<"@ line"<<__LINE__<<endl #define cer2(a,b) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<"@ line"<<__LINE__<<endl #define cer3(a,b,c) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<','<<#c<<'='<<(c)<<','<<"@ line"<<__LINE__<<endl #define pdd pair<db,db> #define Yes cout<<"Yes"<<'\n' #define No cout<<"No"<<'\n' #define KV(x) #x << " = " << x << ";" #define DEBUG DebugLine(__LINE__) #define bitCount(x) __builtin_popcount(x) #define i128 __int128 using namespace std; const int maxn=3e5+100; const ll mode=998244353; const ll mode2=1e9+7; const ll inf=9223372036854775807; const db eps=1e-6; ll n,m; ll sum,ans; string str; vector<int>vt; int vis[maxn]; struct node{ ll k,s; }a[maxn]; bool cmp1(const node&n1,const node&n2) { return n1.s>n2.s; } bool cmp2(const node&n1,const node&n2) { if(n1.s!=n2.s) return n1.s>n2.s; return n1.k<n2.k; } void solve() { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i].k>>a[i].s; } sort(a+1,a+1+n,cmp1); m*=1.5; int score=a[m].s; vector<node>v; for(int i=1;i<=n;i++) { if(a[i].s>=score) v.pb(a[i]); else break; } cout<<score<<" "<<v.size()<<'\n'; sort(v.begin(),v.end(),cmp2); for(auto it:v) { cout<<it.k<<" "<<it.s<<'\n'; } } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int _; _=1; // cin>>_; while(_--) solve(); return 0; /* 1.深呼吸,不要紧张,慢慢读题,读明白题,题目往往比你想的简单。 2.暴力枚举:枚举什么,是否可以使用一些技巧加快枚举速度(预处理、前缀和、数据结构、数论分块)。 3.贪心:需要排序或使用数据结构(pq)吗,这么贪心一定最优吗。 4.二分:满足单调性吗,怎么二分,如何确定二分函数返回值是什么。 5.位运算:按位贪心,还是与位运算本身的性质有关。 6.数学题:和最大公因数、质因子、取模是否有关。 7.dp:怎么设计状态,状态转移方程是什么,初态是什么,使用循环还是记搜转移。 8.搜索:dfs 还是 bfs ,搜索的时候状态是什么,需要记忆化吗。 9.树上问题:是树形dp、树上贪心、或者是在树上搜索。 10.图论:依靠什么样的关系建图,是求环统计结果还是最短路。 11.组合数学:有几种值,每种值如何被组成,容斥关系是什么。 12.交互题:log(n)次如何二分,2*n 次如何通过 n 次求出一些值,再根据剩余次数求答案。 13.如果以上几种都不是,多半是有一个 point 你没有注意到,记住正难则反。 */ }

题目:P1104 生日

网址:https://www.luogu.com.cn/problem/P1104

思路:按照题目的意思模拟就行。

知识点:sort函数的使用,自定义排序函数。

代码:

#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define pss pair<string,string> #define fi first #define se second #define pb push_back #define eb emplace_back #define pbb pair<bool,bool> #define un unsigned #define ull unsigned long long #define int_INF 0x3f3f3f3f #define LL long long #define ll_INF 0x3f3f3f3f3f3f3f3f #define lb long double #define db double #define re return #define pll pair<ll,ll> #define mp make_pair #define eb emplace_back #define all(x) (x).begin(),(x).end() #define debug(a) cout<<"debug: "<<(#a)<<" = "<<a<<'\n' #define cer(a) cerr<<#a<<'='<<(a)<<"@ line"<<__LINE__<<endl #define cer2(a,b) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<"@ line"<<__LINE__<<endl #define cer3(a,b,c) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<','<<#c<<'='<<(c)<<','<<"@ line"<<__LINE__<<endl #define pdd pair<db,db> #define Yes cout<<"Yes"<<'\n' #define No cout<<"No"<<'\n' #define KV(x) #x << " = " << x << ";" #define DEBUG DebugLine(__LINE__) #define bitCount(x) __builtin_popcount(x) #define i128 __int128 using namespace std; const int maxn=3e5+100; const ll mode=998244353; const ll mode2=1e9+7; const ll inf=9223372036854775807; const db eps=1e-6; ll n,m; ll sum,ans; string str; vector<int>vt; int vis[maxn]; struct node{ ll id,y,m,d; string name; }a[maxn]; ll myhash(ll y,ll m,ll d) { return y*100000+m*1000+d; } bool cmp(const node&n1,const node&n2) { if(myhash(n1.y,n1.m,n1.d)==myhash(n2.y,n2.m,n2.d)) return n1.id>n2.id; return myhash(n1.y,n1.m,n1.d)<myhash(n2.y,n2.m,n2.d); } void solve() { cin>>n; for(int i=1;i<=n;i++) { a[i].id=i; cin>>a[i].name; cin>>a[i].y>>a[i].m>>a[i].d; } sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++) cout<<a[i].name<<'\n'; } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int _; _=1; // cin>>_; while(_--) solve(); return 0; /* 1.深呼吸,不要紧张,慢慢读题,读明白题,题目往往比你想的简单。 2.暴力枚举:枚举什么,是否可以使用一些技巧加快枚举速度(预处理、前缀和、数据结构、数论分块)。 3.贪心:需要排序或使用数据结构(pq)吗,这么贪心一定最优吗。 4.二分:满足单调性吗,怎么二分,如何确定二分函数返回值是什么。 5.位运算:按位贪心,还是与位运算本身的性质有关。 6.数学题:和最大公因数、质因子、取模是否有关。 7.dp:怎么设计状态,状态转移方程是什么,初态是什么,使用循环还是记搜转移。 8.搜索:dfs 还是 bfs ,搜索的时候状态是什么,需要记忆化吗。 9.树上问题:是树形dp、树上贪心、或者是在树上搜索。 10.图论:依靠什么样的关系建图,是求环统计结果还是最短路。 11.组合数学:有几种值,每种值如何被组成,容斥关系是什么。 12.交互题:log(n)次如何二分,2*n 次如何通过 n 次求出一些值,再根据剩余次数求答案。 13.如果以上几种都不是,多半是有一个 point 你没有注意到,记住正难则反。 */ }

题目:P5740 【深基7.例9】最厉害的学生

网址:https://www.luogu.com.cn/problem/P5740

思路:按照题目意思进行模拟就行。

知识点:sort函数的使用,自定义排序函数。

代码:

#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define pss pair<string,string> #define fi first #define se second #define pb push_back #define eb emplace_back #define pbb pair<bool,bool> #define un unsigned #define ull unsigned long long #define int_INF 0x3f3f3f3f #define LL long long #define ll_INF 0x3f3f3f3f3f3f3f3f #define lb long double #define db double #define re return #define pll pair<ll,ll> #define mp make_pair #define eb emplace_back #define all(x) (x).begin(),(x).end() #define debug(a) cout<<"debug: "<<(#a)<<" = "<<a<<'\n' #define cer(a) cerr<<#a<<'='<<(a)<<"@ line"<<__LINE__<<endl #define cer2(a,b) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<"@ line"<<__LINE__<<endl #define cer3(a,b,c) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<','<<#c<<'='<<(c)<<','<<"@ line"<<__LINE__<<endl #define pdd pair<db,db> #define Yes cout<<"Yes"<<'\n' #define No cout<<"No"<<'\n' #define KV(x) #x << " = " << x << ";" #define DEBUG DebugLine(__LINE__) #define bitCount(x) __builtin_popcount(x) #define i128 __int128 using namespace std; const int maxn=3e5+100; const ll mode=998244353; const ll mode2=1e9+7; const ll inf=9223372036854775807; const db eps=1e-6; ll n,m; ll sum,ans; string str; vector<int>vt; int vis[maxn]; struct node{ ll id,s,chinese,math,english; string name; }a[maxn]; bool cmp(const node&n1,const node&n2) { if(n1.s!=n2.s) return n1.s>n2.s; return n1.id<n2.id; } void solve() { cin>>n; for(int i=1;i<=n;i++) { a[i].id=i; cin>>a[i].name; a[i].s=0; cin>>a[i].chinese; cin>>a[i].math; cin>>a[i].english; a[i].s+=a[i].chinese; a[i].s+=a[i].math; a[i].s+=a[i].english; } sort(a+1,a+1+n,cmp); cout<<a[1].name<<" "<<a[1].chinese<<" "<<a[1].math<<" "<<a[1].english; } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int _; _=1; // cin>>_; while(_--) solve(); return 0; /* 1.深呼吸,不要紧张,慢慢读题,读明白题,题目往往比你想的简单。 2.暴力枚举:枚举什么,是否可以使用一些技巧加快枚举速度(预处理、前缀和、数据结构、数论分块)。 3.贪心:需要排序或使用数据结构(pq)吗,这么贪心一定最优吗。 4.二分:满足单调性吗,怎么二分,如何确定二分函数返回值是什么。 5.位运算:按位贪心,还是与位运算本身的性质有关。 6.数学题:和最大公因数、质因子、取模是否有关。 7.dp:怎么设计状态,状态转移方程是什么,初态是什么,使用循环还是记搜转移。 8.搜索:dfs 还是 bfs ,搜索的时候状态是什么,需要记忆化吗。 9.树上问题:是树形dp、树上贪心、或者是在树上搜索。 10.图论:依靠什么样的关系建图,是求环统计结果还是最短路。 11.组合数学:有几种值,每种值如何被组成,容斥关系是什么。 12.交互题:log(n)次如何二分,2*n 次如何通过 n 次求出一些值,再根据剩余次数求答案。 13.如果以上几种都不是,多半是有一个 point 你没有注意到,记住正难则反。 */ }

题目:P1309 [NOIP 2011 普及组] 瑞士轮

网址:https://www.luogu.com.cn/problem/P1309

思路:先进行排序,在进行一轮比赛之后,每两个人一定有一个人总分加一分,另外一个人不加分。我们可以发现一个规律,需要加分的人再加分之后他们的分数还是单调的,不需要加分的人他们的分数也是单调的,也就是意为着需要把这两个单调的数组合并成一个数组。

知识点:归并排序

代码:

#include<bits/stdc++.h> #define ull unsigned long long #define ll long long #define pll pair<ll,ll> #define fi first #define cer(a) cerr<<#a<<'='<<(a)<<"@ line"<<__LINE__<<endl #define cer2(a,b) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<"@ line"<<__LINE__<<endl #define se second #define db double #define eb emplace_back #define pb push_back #define pii pair<int,int> using namespace std; const int maxn=2e5+100; const ll mode2=1e9+7; string str; ll n,m; vector<int>vt[maxn]; int vis[maxn]; ll ans,sum; struct node{ ll s,id,w; }a[maxn],win[maxn],lose[maxn]; int cnt1,cnt2; bool cmp(const node&n1,const node&n2) { if(n1.s!=n2.s) return n1.s>n2.s; return n1.id<n2.id; } void merge() { int i=1,j=1,cnt=0; while(i<=cnt1&&j<=cnt2) { if(cmp(win[i],lose[j])) { a[++cnt]=win[i]; i++; }else{ a[++cnt]=lose[j]; j++; } } while(i<=cnt1) a[++cnt]=win[i++]; while(j<=cnt2) a[++cnt]=lose[j++]; } void solve() { int R,Q; cin>>n>>R>>Q; for(int i=1;i<=2*n;i++) { cin>>a[i].s; a[i].id=i; } for(int i=1;i<=2*n;i++) { cin>>a[i].w; } sort(a+1,a+1+2*n,cmp); while(R--) { cnt1=0; cnt2=0; for(int i=1;i<=2*n;i+=2) { if(a[i].w<a[i+1].w) { a[i+1].s++; win[++cnt1]=a[i+1]; lose[++cnt2]=a[i]; } else{ a[i].s++; win[++cnt1]=a[i]; lose[++cnt2]=a[i+1]; } } merge(); } cout<<a[Q].id; } int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); int _=1; // cin>>_; while(_--) solve(); return 0; }

题目:B4171 [BCSP-X 2024 6 月小学高年级组] 选择排序

网址:https://www.luogu.com.cn/problem/B4171

思路:定义一个map,存储i这个数在哪个下标。

知识点:选择排序,简单思维

代码:

#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define pss pair<string,string> #define fi first #define se second #define pb push_back #define eb emplace_back #define pbb pair<bool,bool> #define un unsigned #define ull unsigned long long #define int_INF 0x3f3f3f3f #define LL long long #define ll_INF 0x3f3f3f3f3f3f3f3f #define lb long double #define db double #define re return #define pll pair<ll,ll> #define mp make_pair #define eb emplace_back #define all(x) (x).begin(),(x).end() #define debug(a) cout<<"debug: "<<(#a)<<" = "<<a<<'\n' #define cer(a) cerr<<#a<<'='<<(a)<<"@ line"<<__LINE__<<endl #define cer2(a,b) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<"@ line"<<__LINE__<<endl #define cer3(a,b,c) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<','<<#c<<'='<<(c)<<','<<"@ line"<<__LINE__<<endl #define pdd pair<db,db> #define Yes cout<<"Yes"<<'\n' #define No cout<<"No"<<'\n' #define KV(x) #x << " = " << x << ";" #define DEBUG DebugLine(__LINE__) #define bitCount(x) __builtin_popcount(x) #define i128 __int128 using namespace std; const int maxn=3e5+100; const ll mode=998244353; const ll mode2=1e9+7; const ll inf=9223372036854775807; const db eps=1e-6; ll n,m; ll sum,ans; string str; vector<int>vt; int vis[maxn]; ll a[maxn]; void solve() { cin>>n>>m; map<ll,int>p; for(int i=1;i<=n;i++) { cin>>a[i]; p[a[i]]=i; } for(int i=1;i<=m;i++) { int x; cin>>x; vis[x]=1; } for(int i=1;i<=n-1;i++) { if(p[i]!=i) { int pos=p[i]; swap(a[i],a[pos]); p[a[i]]=i; p[a[pos]]=pos; } if(vis[i]) { for(int j=1;j<=n;j++) cout<<a[j]<<" "; cout<<'\n'; } } } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int _; _=1; // cin>>_; while(_--) solve(); return 0; /* 1.深呼吸,不要紧张,慢慢读题,读明白题,题目往往比你想的简单。 2.暴力枚举:枚举什么,是否可以使用一些技巧加快枚举速度(预处理、前缀和、数据结构、数论分块)。 3.贪心:需要排序或使用数据结构(pq)吗,这么贪心一定最优吗。 4.二分:满足单调性吗,怎么二分,如何确定二分函数返回值是什么。 5.位运算:按位贪心,还是与位运算本身的性质有关。 6.数学题:和最大公因数、质因子、取模是否有关。 7.dp:怎么设计状态,状态转移方程是什么,初态是什么,使用循环还是记搜转移。 8.搜索:dfs 还是 bfs ,搜索的时候状态是什么,需要记忆化吗。 9.树上问题:是树形dp、树上贪心、或者是在树上搜索。 10.图论:依靠什么样的关系建图,是求环统计结果还是最短路。 11.组合数学:有几种值,每种值如何被组成,容斥关系是什么。 12.交互题:log(n)次如何二分,2*n 次如何通过 n 次求出一些值,再根据剩余次数求答案。 13.如果以上几种都不是,多半是有一个 point 你没有注意到,记住正难则反。 */ }

题目:P7910 [CSP-J 2021] 插入排序

网址:https://www.luogu.com.cn/problem/P7910

思路:因为操作一的次数最多为5000次,数组的长度最大为8000,那么对于每一次操作一,我们都重新排序一遍并记录好值。

知识点:模拟、简单思维

代码:

#include<bits/stdc++.h> #define ull unsigned long long #define ll long long #define pll pair<ll,ll> #define fi first #define cer(a) cerr<<#a<<'='<<(a)<<"@ line"<<__LINE__<<endl #define cer2(a,b) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<"@ line"<<__LINE__<<endl #define se second #define db double #define eb emplace_back #define pb push_back #define pii pair<int,int> using namespace std; const int maxn=2e5+100; const ll mode2=1e9+7; string str; ll n,m; vector<int>vt[maxn]; int vis[maxn]; ll ans,sum; struct node{ ll v,id; }a[maxn]; int p[maxn]; bool cmp(const node&n1,const node&n2) { if(n1.v!=n2.v) return n1.v<n2.v; return n1.id<n2.id; } void cal() { for(int i=1;i<=n;i++) { p[a[i].id]=i; } } void solve() { int q; cin>>n>>q; for(int i=1;i<=n;i++) { cin>>a[i].v; a[i].id=i; } sort(a+1,a+1+n,cmp); cal(); while(q--) { int op; cin>>op; if(op==2) { int x; cin>>x; cout<<p[x]<<'\n'; continue; } ll x,v; cin>>x>>v; int id; for(int i=1;i<=n;i++) { if(a[i].id==x) { a[i].v=v; id=i; break; } } for(int i=id;i>=2;i--) { if(a[i-1].v>a[i].v) { swap(a[i-1],a[i]); }else if(a[i-1].v==a[i].v&&a[i-1].id>a[i].id) { swap(a[i-1],a[i]); }else break; } for(int i=id;i+1<=n;i++) { if(a[i].v>a[i+1].v) { swap(a[i],a[i+1]); }else if(a[i].v==a[i+1].v&&a[i].id>a[i+1].id) { swap(a[i],a[i+1]); }else break; } cal(); } } int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); int _=1; // cin>>_; while(_--) solve(); return 0; }

题目:P1138 第 k 小整数

网址:https://www.luogu.com.cn/problem/P1138

思路:按照题目意思进行模拟

知识点:模拟

代码:

#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define pss pair<string,string> #define fi first #define se second #define pb push_back #define eb emplace_back #define pbb pair<bool,bool> #define un unsigned #define ull unsigned long long #define int_INF 0x3f3f3f3f #define LL long long #define ll_INF 0x3f3f3f3f3f3f3f3f #define lb long double #define db double #define re return #define pll pair<ll,ll> #define mp make_pair #define eb emplace_back #define all(x) (x).begin(),(x).end() #define debug(a) cout<<"debug: "<<(#a)<<" = "<<a<<'\n' #define cer(a) cerr<<#a<<'='<<(a)<<"@ line"<<__LINE__<<endl #define cer2(a,b) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<"@ line"<<__LINE__<<endl #define cer3(a,b,c) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<','<<#c<<'='<<(c)<<','<<"@ line"<<__LINE__<<endl #define pdd pair<db,db> #define Yes cout<<"Yes"<<'\n' #define No cout<<"No"<<'\n' #define KV(x) #x << " = " << x << ";" #define DEBUG DebugLine(__LINE__) #define bitCount(x) __builtin_popcount(x) #define i128 __int128 using namespace std; const int maxn=3e5+100; const ll mode=998244353; const ll mode2=1e9+7; const ll inf=9223372036854775807; const db eps=1e-6; ll n,m; ll sum,ans; string str; vector<int>vt; int vis[maxn]; ll a[maxn]; void solve() { ll k; cin>>n>>k; set<ll>st; for(int i=1;i<=n;i++) { ll x; cin>>x; st.insert(x); } if(st.size()<k) { cout<<"NO RESULT"; return; } for(int i=1;i<=k-1;i++) { st.erase(st.begin()); } cout<<(*st.begin()); } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int _; _=1; // cin>>_; while(_--) solve(); return 0; /* 1.深呼吸,不要紧张,慢慢读题,读明白题,题目往往比你想的简单。 2.暴力枚举:枚举什么,是否可以使用一些技巧加快枚举速度(预处理、前缀和、数据结构、数论分块)。 3.贪心:需要排序或使用数据结构(pq)吗,这么贪心一定最优吗。 4.二分:满足单调性吗,怎么二分,如何确定二分函数返回值是什么。 5.位运算:按位贪心,还是与位运算本身的性质有关。 6.数学题:和最大公因数、质因子、取模是否有关。 7.dp:怎么设计状态,状态转移方程是什么,初态是什么,使用循环还是记搜转移。 8.搜索:dfs 还是 bfs ,搜索的时候状态是什么,需要记忆化吗。 9.树上问题:是树形dp、树上贪心、或者是在树上搜索。 10.图论:依靠什么样的关系建图,是求环统计结果还是最短路。 11.组合数学:有几种值,每种值如何被组成,容斥关系是什么。 12.交互题:log(n)次如何二分,2*n 次如何通过 n 次求出一些值,再根据剩余次数求答案。 13.如果以上几种都不是,多半是有一个 point 你没有注意到,记住正难则反。 */ }

题目:P2676 [USACO07DEC] Bookshelf B

网址:https://www.luogu.com.cn/problem/P2676

思路:按照题目意思进行模拟

知识点:模拟

代码:

#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define pss pair<string,string> #define fi first #define se second #define pb push_back #define eb emplace_back #define pbb pair<bool,bool> #define un unsigned #define ull unsigned long long #define int_INF 0x3f3f3f3f #define LL long long #define ll_INF 0x3f3f3f3f3f3f3f3f #define lb long double #define db double #define re return #define pll pair<ll,ll> #define mp make_pair #define eb emplace_back #define all(x) (x).begin(),(x).end() #define debug(a) cout<<"debug: "<<(#a)<<" = "<<a<<'\n' #define cer(a) cerr<<#a<<'='<<(a)<<"@ line"<<__LINE__<<endl #define cer2(a,b) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<"@ line"<<__LINE__<<endl #define cer3(a,b,c) cerr<<#a<<'='<<(a)<<','<<#b<<'='<<(b)<<','<<#c<<'='<<(c)<<','<<"@ line"<<__LINE__<<endl #define pdd pair<db,db> #define Yes cout<<"Yes"<<'\n' #define No cout<<"No"<<'\n' #define KV(x) #x << " = " << x << ";" #define DEBUG DebugLine(__LINE__) #define bitCount(x) __builtin_popcount(x) #define i128 __int128 using namespace std; const int maxn=3e5+100; const ll mode=998244353; const ll mode2=1e9+7; const ll inf=9223372036854775807; const db eps=1e-6; ll n,m; ll sum,ans; string str; vector<int>vt; int vis[maxn]; ll a[maxn]; void solve() { ll B; cin>>n>>B; for(int i=1;i<=n;i++) cin>>a[i]; ll s=0; sort(a+1,a+1+n); reverse(a+1,a+1+n); for(int i=1;i<=n;i++) { s+=a[i]; if(s>=B) { cout<<i; return; } } } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int _; _=1; // cin>>_; while(_--) solve(); return 0; /* 1.深呼吸,不要紧张,慢慢读题,读明白题,题目往往比你想的简单。 2.暴力枚举:枚举什么,是否可以使用一些技巧加快枚举速度(预处理、前缀和、数据结构、数论分块)。 3.贪心:需要排序或使用数据结构(pq)吗,这么贪心一定最优吗。 4.二分:满足单调性吗,怎么二分,如何确定二分函数返回值是什么。 5.位运算:按位贪心,还是与位运算本身的性质有关。 6.数学题:和最大公因数、质因子、取模是否有关。 7.dp:怎么设计状态,状态转移方程是什么,初态是什么,使用循环还是记搜转移。 8.搜索:dfs 还是 bfs ,搜索的时候状态是什么,需要记忆化吗。 9.树上问题:是树形dp、树上贪心、或者是在树上搜索。 10.图论:依靠什么样的关系建图,是求环统计结果还是最短路。 11.组合数学:有几种值,每种值如何被组成,容斥关系是什么。 12.交互题:log(n)次如何二分,2*n 次如何通过 n 次求出一些值,再根据剩余次数求答案。 13.如果以上几种都不是,多半是有一个 point 你没有注意到,记住正难则反。 */ }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询