ACM预备队训练第二周 贪心算法

一.洛谷 P1007 独木桥

本题思路:本题注意用贪心的思想。重难点是要考虑到:士兵相遇后转身回走,可以看成两人穿过彼此并继续向前走。就意味着不要考虑士兵的相遇问题,看成桥上每次只有一人。

注意:注意审题,题中开始位置坐标为0,结尾是L+1。所以是L-aa[i]+1。

本题代码:

#include
#define ll long long
using namespace std;
const int N=5e3+10;
int l,n,min1=0,max1=0;
int aa[N];
int main()
{
	cin>>l>>n;
	for (int i=0;i>aa[i];
		min1= max(min1,min(aa[i],l-aa[i]+1));
		max1= max(max1,max(aa[i],l-aa[i]+1)); 
	} 
	cout<

二.洛谷 P1223 排队接水

本题思路:这题明显用贪心算法,贪心思想的指导下我们要先让等待时间少的人先接水,这样所有人等待的时间就会最少。

代码如下:

#include 
#include 
#include 
using namespace std;
struct Node
{
    int T;
    int order;
};
bool cmp(Node a,Node b);
    int main()
    {
        int n;
        cin>>n;
        Node node[n+1];
        for(int i=1;i<=n;i++)
        {
            cin>>node[i].T;
            node[i].order=i;
        }
        sort(node+1,node+n+1,cmp);
        double sum=0;
        for(int i=1;i<=n-1;i++)
        {
            sum+=(node[i].T*(n-i))/(double)n;
        }

        for(int i=1;i<=n;i++)
        {
            cout<

三.洛谷 P1803 凌乱的yyy / 线段覆盖

本题思路:按照比赛的结束时间排序,结束时间早的排在前面。这样就可以参加尽量早结束的比赛,从而多参加。比赛的开始时间,持续时间不重要,早开始可能晚结束,而结束时间表示开始下一个比赛的时间,所以要按贪心的思维将结束时间排序。(超级详细了)

另外,在代码中要注意更新b,表示有空的时间。

代码如下:

//#include 
#include
using namespace std;
#define ll long long
struct aa
{
	ll begin,end;
};
bool cmp(aa a,aa b)
{
	if (a.end == b.end) return a.begin>b.begin;
	else return a.end>n;
	struct aa a[n+5];
	for (int i=0;i>a[i].begin>>a[i].end;
	sort (a,a+n,cmp);
    ll c=0,b=0;
    for (int i=0;i=b)
    	{
    		c++;
    		b=a[i].end;
		}
	}
	cout<

四.洛谷 P1031 [NOIP2002 提高组] 均分纸牌

本题思路:本题想要次数最少,则应该每个位置的次数最少移动,所以将每个位置的数与平均值ave比较。并保证从一边开始,向另一边依次整理每一个数。这样就可以保证次数最少了。

本题代码:

#include 
#define ll long long
using namespace std;
int n,aa[120],ave,c=0;
ll sum=0;
int main()
{
	cin>>n;
	for (int i=0;i>aa[i];
		sum+=aa[i];
	}
	ave=sum/n;
	for (int i=0;i

你可能感兴趣的:(ACM,预备队培训,贪心算法,算法)