1. 题目链接:1025 答疑
贪心类型的题目做法很简单,只需要保证局部解最优即可保证整体解最优。
这里的思路就是第i个学生前面的人答疑所用的时间最短,那么他所发送短信的时间节点越小。这道题目有个需要注意的点是:要先将前i-1个学生所用的总时长加到res统计结果的计数器中,再加上第i个学生的进入时间和答疑时间才是正确的数据,不能加漏。以及语句之中的空格能不打就不打,以免出现不必要的错误。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
struct student{
long long int s,a,e;
unsigned long long int sum1,sum2;
}stud[maxn];
bool cmp(student x,student y)
{
if(x.sum1 == y.sum1) return x.sum2<y.sum2;
else return x.sum1<y.sum1;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lld %lld %lld",&stud[i].s,&stud[i].a,&stud[i].e);
stud[i].sum1=stud[i].s+stud[i].a+stud[i].e;
stud[i].sum2=stud[i].s+stud[i].a;
}
sort(stud,stud+n,cmp);
long long int res=0,temp=0;
for(int i=0;i<n;i++)
{
res +=temp+stud[i].sum2;
temp +=stud[i].sum1;
}
printf("%lld",res);
return 0;
}
2.题目链接:19724 食堂
这道题的贪心思路是:尽量保证能坐下的人最多,则通过题目所给出的示例可知,尽量用3人寝的填满6人桌,或者1个2人寝和1个4人寝室填满6人桌(这个的实现思路非常巧妙,后面会讲),用2人寝填满4人桌。也就是尽量不要留空位。
那么先满足六人桌。先解决3人寝,再让1个2人寝的坐6人桌,此时剩下4个位置,将这4个位置看成一个4人桌,则4人桌的个数需要加1。
6人桌坐满后,对4人桌进行处理。先让2人寝坐满4人桌,再接着4人寝室,3人寝,2人寝此时只剩1个,会浪费2个位置。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int q;
int main()
{
cin>>q;
for(int i=1;i<=q;++i)
{
int a2,a3,a4,b4,b6;
cin>>a2>>a3>>a4>>b4>>b6;
int result=0;
while((a3>=2) && b6)
{
result+=6;
a3-=2;
b6--;
}
while(a2 && b6)
{
result+=2;
a2--;
b6--;
b4++; //看了别人的题解,这里真的很绝
}
while(a4 && b6)
{
result+=4;
a4--;
b6--;
}
while(a3 && b6)
{
result+=3;
a3--;
b6--;
}
while(a4 && b4)
{
result+=4;
a4--;
b4--;
}
while((a2>=2) && b4)
{
result+=4;
a2-=2;
b4--;
}
while(a3 && b4)
{
result+=3;
a3--;
b4--;
}
while(a2 && b4)
{
result+=2;
a2--;
b4--;
}
cout<<result<<endl;
}
return 0;
}