CSP2023-03

发布时间 2023-05-01 22:22:03作者: 尊滴菜

第一题

 直接满分了:

#include <iostream>
using namespace std ;

const int N = 1e6 ; 

int n,a,b ; 

int panduan(int x1,int y1,int x2, int y2, int a,int b)
{
    int c,k ; 
    if( x2<0 || y2<0 || x1>a || y1>b ) return 0 ; // 在外侧
    else {
        // 先判断x 左 中 右
        if( x1<=0 && x2<=a )  c = x2 ;
        else if( x1>=0 && x2<=a ) c = x2-x1 ; 
        else if( x1>=0 && x2>=a) c = a-x1 ;
    
        // 判断 y 上中下
        if( y1>=0 && y2>=b) k = b-y1 ;
        else if(y1>=0 && y2<=b )  k = y2-y1; 
        else if(y1<=0 && y2<=b) k = y2 ; 
    }
    return c*k ;
}

int main(){
    cin>>n>>a>>b ; 
    int x1,y1,x2,y2 ; 
    int sum =0 ;
    for(int i=0; i<n ; i++)
    {
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2) ;    
        sum += panduan(x1,y1,x2,y2,a,b) ; 
    }
    cout<<sum<<endl ; 
    
    return 0 ; 
}

第二题

 第一次提交只拿了 70分, 出现了超时错误,应该是每次都遍历所有点的问题

#include <iostream>
#include <algorithm>
using namespace std ;

const int N = 1e6 ; 

int n,m,k ; 

struct tian{
    int t,c ;
}t[N] ; 

bool cmp(tian a, tian b)
{
    return a.t>b.t ; 
}
int main(){
    cin>>n>>m>>k ; 
    for(int i=0; i<n; i++) 
        scanf("%d%d", &t[i].t, &t[i].c) ; 
    sort(t,t+n,cmp) ;  // 按照耗时进行排序
    int max = t[0].t ; // 标记最大耗时 
    while(m>=0)
    {
        max -- ;    // 提出要求
        if( max < k) break ; // 达到最低线
        for(int i=0 ; i<n ; i++)
        {
            if( t[i].t > max)
            {
                t[i].t-- ;  
                m -= t[i].c ;
            }
        }
    } 
    cout<<max+1 ;   
    return 0 ; 
}

老师给的代码,可以100