校赛补题

用爱发电

题目描述

Lyh学长用爱发电,为亲爱的学弟学妹们讲解c和c++,然而艰苦的条件限制着学长的发挥。学长的工作区上可能会出现一些地方无法写字!

假设有一个矩形背景,左下角的坐标为(0,0),学长矩形工作区的左下角坐标和右上角坐标为(x1,y1),(x2,y2),两个无法写字的矩形区域的左下角坐标和右上角坐标分别为(x3,y3)(x4,y4)(x5,y5)(x6,y6)。请问,lyh学长可以在工作区内写字吗?

Lyh:只要还有一个点能写字,我就一定会坚持讲课!

输入描述:

输入保证所有点均为整点,所有点的范围均在[0,106]。所有矩形区域的边均与背景图平行。

第一行输入x1,y1,x2,y2,代表lyh学长的工作区。

第二行输入x3,y3,x4,y4,代表第一个无法写字的区域。

第三行输入x5,y5,x6,y6,代表第二个无法写字的区域。

输出描述:

若能输出 "YES" (不带引号),否则输出"NO" (不带引号)。
示例1

输入

复制
2 2 4 4
1 1 3 5
3 1 5 5

输出

复制
NO

说明

在该例子中,白色工作表被黑色区域完全覆盖。
示例2

输入

复制
3 3 7 5
0 0 4 6
0 0 7 4

输出

复制
YES

说明

在该例子中点(6.5,4.5)严格位于黑色区域外且在白色区域内。
示例3

输入

复制
5 2 10 5
3 1 7 6
8 1 11 7

输出

复制
YES
示例4

输入

复制
0 0 1000000 1000000
0 0 499999 1000000
500000 0 1000000 1000000 

输出

复制
YES
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6;
    cin>>x1>>y1>>x2>>y2;
    cin>>x3>>y3>>x4>>y4;
    cin>>x5>>y5>>x6>>y6;
    if(x3<=x1&&y3<=y1&&x4>=x2&&y4>=y2)        
        cout<<"NO"<<endl;//第一个黑色全包围了白色 
    else if(x5<=x1&&y5<=y1&&x6>=x2&&y6>=y2)        
        cout<<"NO"<<endl;//第二个黑色全包围了白色
    else if(y3<=y1&&y4>=y2&&y5<=y1&&y6>=y2)
    {
        if(x3<=x1&&x5<=x4&&x6>=x2)
            cout<<"NO"<<endl;//1 
        else if(x5<=x1&&x3<=x6&&x4>=x2)
            cout<<"NO"<<endl;//2 
        else
            cout<<"YES"<<endl;
    }
    else if(x3<=x1&&x4>=x2&&x5<=x1&&x6>=x2)
    {
        if(y5<=y1&&y3<=y6&&y4>=y2)
            cout<<"NO"<<endl;
        else if(y3<=y1&&y5<=y4&&y6>=y2)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
    }
    else
        cout<<"YES"<<endl;
    return 0;
}

 完美项目

题目描述

PYF对算法很感兴趣,假设他目前的算法能力值为r。一些非常富有的公司委托石家庄铁道大学算法协会完成一些高难度的算法项目,PYF身为算法协会的接班人,他想包揽所有的这些项目来证明自己的能力,他能做到吗?显然,PYF每完成一个项目,他的算法能力值将会发生变化!但是,他的能力值不能为负数!是的,任何一个顾客都讨厌能力值为负数的人,为了PYF的未来,你不能让他在做完所有项目之后能力值为负数!请你编写一个程序检查是否存在一个顺序能使PYF完成所有的项目,并在完成项目之后能力值非负。

输入描述:

输入的第一行包含两个用空格隔开的整数,n和r,(1≤n≤100,1≤r≤30000),代表项目数和PYF的初始能力值。
接下来有n行,每行包含两个整数a和b(-300≤a≤300,-300≤b≤300)代表完成该项目所需能力值和完成后的能力变化值。

输出描述:

若能输出 "YES" (不带引号),否则输出"NO" (不带引号)。
示例1

输入

复制
3 4
4 6
10 -2
8 -1

输出

复制
YES

说明

在该示例中顺序为1,2,3。
示例2

输入

复制
3 5
4 -5
4 -2
1 3

输出

复制
YES

说明

在该示例中顺序为2,3,1。
示例3

输入

复制
4 4
5 2
5 -3
2 1
4 -2

输出

复制
YES

说明

在该示例中顺序为3,1,4,2。
示例4

输入

复制
3 10
10 0
10 -10
30 0

输出

复制
NO

 超时了好难受,但是next_permutation+结构体这是我第一次写,于是记录一下写法

#include<iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<algorithm>
#include<string.h>
#define MAX 998244353

using namespace std;
struct c
{
    int a,b;
}pack[101];
//int pack_a[30001];
//int pack_b[30001];
int n;int r;
//void DFS(int a,int b,int nowr,int index)
//{
//    if(pack_a[index]==a)
//    {
//        //如果到最后一个了
//        if(nowr>0)
//        {
//            cout<<"YES";
//            return ;
//        }
//        else
//        {
//            cout<<"NO";
//            return;
//        } 
//    }
//    for(int c=0;c<2;++c)
//    {
//        if(c)
//        {
//            if(a>r)
//            {
//                //如果开销大于当前开销
//                return; 
//            }
//            else
//            {
//                nowr+=pack_b[index];
//                DFS(pack_a[(index+1)%n],pack_b[(index+1)%n],nowr,(index+1)%n);
//                nowr-=pack_b[index];
//            }
//        }
//        else
//        {
//            DFS(pack_a[(index+1)%n],pack_b[(index+1)%n],nowr,(index+1)%n);
//        }
//    }
//}
bool cmp(struct c a,struct c b)
{
    if(a.a<=b.a)
    {
        if(a.a==b.a)
        {
            if(a.b<=b.b)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return true;
        }
    }
    else
    {
        return false;
    }
}
int main()
{
    
    cin>>n>>r; 
         
    int temp=r;
    for(int i=0;i<n;++i)
    {
        cin>>pack[i].a>>pack[i].b;
        temp+=pack[i].b;
    }
    if(temp<0)
    {
        cout<<"NO";return 0;
    }
//    
//    DFS(pack_a[0],pack_b[0],0,0);
    sort(pack,pack+n,cmp);
//    cout<<"<<";
//    for(int i=0;i<n;++i)cout<<pack[i].a<<","<<pack[i].b<<" ";
//    cout<<endl;
    
    int key=1;
    do
    {
        int sum=r;
        int flag=0;
//        cout<<">>";
//        for(int i=0;i<n;++i)cout<<pack[i].a<<","<<pack[i].b<<" ";
//        cout<<endl;
        for(int i=0;i<n;++i)
        {    
            if(pack[i].a<=sum)
            {
                sum+=pack[i].b;    
            }
            else
            {   
//                goto stop;
                flag=1;
                break;
            }
        }
//        cout<<"sum="<<sum<<endl; 
        if(!flag)
        {
            if(sum>=0)
            {
                cout<<"YES";
                key=0;
                goto stop;
            }
        }
         
    }while(next_permutation(pack,pack+n,cmp));
    
    stop:if(key)cout<<"NO";
    return 0;
}
View Code

 一个贪心,关键是cmp函数,改了巨久终于对了,太励志了,我为我自己感动

#include<iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<algorithm>
#include<string.h>
#define MAX 998244353

using namespace std;
struct c
{
    int a,b,c;
    int flag;
}pack[102];
int n;int r;
bool cmp(struct c a,struct c b) 
{
    if(a.c>b.c)
    {
        return true;
    }
    else if(a.c==b.c)
    {
        if(a.c==1)//b值同为正 
        { 
            if(a.a==b.a)//a值一样按b值大的排序 
            {
                return a.b>b.b;
            }
            else//按照a值从小到大排序
            {
                return a.a<b.a;
            } 
        }
        else
        {
            //b值为负,看a值和b值的和, 
            return ((a.a+a.b)>(b.b+b.a));
        }
    }
    else
    {
        return false;
    }
}
int main()
{
    
    cin>>n>>r; 
    memset(pack,0,sizeof(pack));
    int temp=r;
    for(int i=0;i<n;++i)
    {
        cin>>pack[i].a>>pack[i].b;
        pack[i].c=(pack[i].b>=0)?1:0;
        temp+=pack[i].b;
    }
    if(temp<0)
    {
        cout<<"NO";return 0;
    }
    sort(pack,pack+n,cmp);
    int sum=r,flag=0;
    for(int i=0;i<n;++i)
    {
        if(pack[i].a<=sum)
        {
            sum+=pack[i].b;
        }
        else
        {
            flag=1;break;
        }        
    } 
    if(flag)
    {
        cout<<"NO";
    }
    else
    {
        cout<<"YES";
    }

    return 0;
}

 

posted @ 2019-11-16 22:27  东坡肉肉君  阅读(166)  评论(0)    收藏  举报