- P3817 小A的糖果
思路
很容易理解占有两个组的盒子,减去糖果数可以使吃掉的糖果数最少。
但第一个盒子可能大于x,则刚开始的时候就需要减去。
源码
#include<bits/stdc++.h>
using namespace std;
int n,x;
int a[1000005];
long long sum;
int main(){
cin>>n>>x;
cin>>a[1];
if(a[1]>x){
sum+=a[1]-x;
a[1]=x;
}
for(int i=2;i<=n;i++){
cin>>a[i];
if(a[i]+a[i-1]>x){
sum+=a[i]+a[i-1]-x;
a[i]=x-a[i-1];
}
}
cout<<sum<<endl;
return 0;
}
- P3650 [USACO1.3]滑雪课程设计Ski Course Design
思路
看到这个题目,可以想到肯定第一反应是要比较最高和最低的差。
然后可以进行排序。然后分别将最低峰和最高峰这个区间内的高度a作为最低的高度,其他的高度在a+17内
源码
#include<bits/stdc++.h>
using namespace std;
int n,a[1005];
int main(){
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int sum=0,s=1e9;
for(int j=a[0];j<=a[n-1];j++){
sum=0;
for(int t=0;t<n;t++){
if(a[t]-j>17) sum+=(a[t]-j-17)*(a[t]-j-17);
if(a[t]<j) sum+=(a[t]-j)*(a[t]-j);
}
s=min(sum,s);
}
cout<<s<<endl;
}
- P1803 凌乱的yyy / 线段覆盖
思路
把时间按结束时间排序,然后在进行计较。
计较的关键点:下一个点的开始时间大于上一个结束的时间。
源码
#include<bits/stdc++.h>//(万能库)
struct px{//(定义一个结构体数组,分别储存开始时间和结束时间)
int a;//(开始时间)
int b;//(结束时间)
}x[2000000];
bool cmp(px x,px y){//(不管开始时间,直接按照结束时间排序)
return x.b<y.b;
}
using namespace std;
int main(){
int n,sum=1,mi;
scanf("%d",&n);
for(int i=1;i<=n;i++)
cin>>x[i].a>>x[i].b;//(读入数据)
sort(x+1,x+n+1,cmp);//(排序)
mi=x[1].b;//(无脑记录第一个值)
int j=1;
while(j<=n)//(未优化的超长循环)
{
j++;
if(x[j].a>=mi) {//(找到符合要求的比赛,记录,参加)
sum++;//(计数)
mi=x[j].b;}
}
cout<<sum;//(输出)
return 0;//(功德圆满)
}
##- P1610 鸿山洞的灯
思路
排序+比较
可以这样判断p[i+1]-p[i-1]<=dist 满足的话,则熄灭中间的p[i]。然后就可以把p[i-1]往前移,即p[i]=p[i-1]。
然后又继续判断三盏灯。
源码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,dist;
int p[1000005];
cin>>n>>dist;
int sum=0;
for(int i=0;i<n;i++)
cin>>p[i];
sort(p,p+n);
for(int i=1;i<n-1;i++){
if((p[i+1]-p[i-1])<=dist){
p[i]=p[i-1]; //进入下一次循环,就相当于p[i-1]
//优化的核心部分。我们使用递推优化。
//其本质是关灯时把前一盏灯移到当前这一盏灯的位置上,
//防止下次计算时寻找前一盏灯。有类似链表删除的作用。
sum++;
}
}
cout<<sum<<endl;
}
- P2095 营养膳食
思路
可以按脂肪排序,然后用一个数组来标记每个种类用掉的份数。
源码
#include<bits/stdc++.h>
using namespace std;
struct per{
int weigh;
int id;
}p[10005];
int cmp(per a,per b){ //按脂肪从大到小排序
return a.weigh>b.weigh;
}
int main(){
int n,m,k;
cin>>n>>m>>k;
int b[10005];//每类需要的类数;
for(int i=1;i<=k;i++)
cin>>b[i];
for(int i=1;i<=n;i++)
cin>>p[i].weigh>>p[i].id;
sort(p+1,p+1+n,cmp);
int ans=0;
for(int i=1;i<=n;i++){
if(b[p[i].id]>0&&m>0){ //判断哪个种类是否还需要和是否还需要吃食品
b[p[i].id]--;
m--;
ans+=p[i].weigh;
}
}
cout<<ans<<endl;
return 0;
}