课后作业-2025-11-02
题目:P1003 [NOIP 2011 提高组] 铺地毯
网址:https://www.luogu.com.cn/problem/P1003
思路:我们先输入每一个地毯的数据,然后倒叙枚举,我们依次判断一下每一个地毯形成的矩形是否符合就行。
知识点:倒叙枚举
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
int X[maxn],Y[maxn],LenX[maxn],LenY[maxn];
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){cin>>X[i]>>Y[i]>>LenX[i]>>LenY[i];	} int x,y;cin>>x>>y;int ans=-1;for(int i=n;i>=1;i--){int sx=X[i],tx=X[i]+LenX[i];int sy=Y[i],ty=Y[i]+LenY[i];if(x>=sx&&x<=tx&&y>=sy&&y<=ty){ans=i;break;}}cout<<ans;return 0;	
}  
题目:P1109 学生分组
网址:https://www.luogu.com.cn/problem/P1109
思路:我们先统计一下不在合理范围内的组 缺少和多余的总人数,接着把组的人数变成合理的范围呢。最后我们枚举一下判断就行。
知识点:简单思维
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;int a[maxn];
int L,R;
int main()
{int n;cin>>n;int ans=0;for(int i=1;i<=n;i++){cin>>a[i];}int v1=0,v2=0;cin>>L>>R;for(int i=1;i<=n;i++){if(a[i]<L){v1+=L-a[i];a[i]=L;}else if(a[i]>R){v2+=a[i]-R;a[i]=R;}}ans=min(v1,v2);v1-=ans;v2-=ans;for(int i=1;i<=n;i++){if(v1==0&&v2==0)break;if(v1>0){int mn=min(v1,a[i]-L);ans+=mn;v1-=mn;}else if(v2>0){int mn=min(v2,R-a[i]);ans+=mn;v2-=mn;}}if(v1+v2>0){cout<<-1;}else{cout<<ans;}return 0;	
}  
 
 
题目:P1105 平台
网址:https://www.luogu.com.cn/problem/P1105
思路:对于每一个平台,我们按照题目的意思一个一个去找就行。
知识点:简单思维
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;int H[maxn],L[maxn],R[maxn];
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){cin>>H[i]>>L[i]>>R[i];}for(int i=1;i<=n;i++){int ans=0;for(int j=1;j<=n;j++){if(H[j]>=H[i])continue;if(L[j]<L[i]&&R[j]>L[i]){if(ans==0)ans=j;else{if(H[j]>H[ans])ans=j;}}}cout<<ans<<" ";ans=0;for(int j=1;j<=n;j++){if(H[j]>=H[i])continue;if(L[j]<R[i]&&R[j]>R[i]){if(ans==0)ans=j;else{if(H[j]>H[ans])ans=j;}}}cout<<ans<<'\n';}return 0;	
}  
 
 
题目:P1104 生日
网址:https://www.luogu.com.cn/problem/P1104
思路:写过相关知识点的话,就按照题目意思就行排序然后输出就行。
知识点:结构体,sort函数,自定义比较函数
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;struct node{string name;int Y,M,D,id;
}a[maxn];
bool cmp(const node&n1,const node&n2)
{if(n1.Y!=n2.Y)return n1.Y<n2.Y;if(n1.M!=n2.M)return n1.M<n2.M;if(n1.D!=n2.D)return n1.D<n2.D;return n1.id>n2.id;
}
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i].name>>a[i].Y>>a[i].M>>a[i].D;	a[i].id=i;} sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){cout<<a[i].name<<'\n';}return 0;	
}  
 
 
题目:P1102 A-B 数对
网址:https://www.luogu.com.cn/problem/P1102
思路:我们先统计一下每个数出现的次数,然后再枚举a,b=a-c,我们直接把b出现的次数加到答案里面就行了。
知识点:map的使用,桶计数法。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;long long a[maxn];
int main()
{long long n,c;cin>>n>>c;map<long long,int>p;long long ans=0;for(int i=1;i<=n;i++){cin>>a[i];p[a[i]]++;}for(int i=1;i<=n;i++){long long b=a[i]-c;ans+=p[b];}cout<<ans;return 0;	
}  
 
 
