CSDN 第 11 期题解

不知道 LaTeX \LaTeX LATEX 修好没有,最近不太想写,退役了。

T1

题目描述

n n n 个同心圆,其半径大小为 a i a_i ai,从最里面的圆开始,跟其相邻区域的圆必须染成不同色,问最外层圆所属的颜色面积多大。

数据范围

忘了,不过可以支持 5 × 1 0 5 5\times 10^5 5×105

题解

π = arccos ⁡ ( − 1 ) \pi=\arccos(-1) π=arccos(1)(实际上就是这样的,C++ 里定义是 const double pi=acos(-1);)。
然后排个序直接做就行了。

代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
double a[N];
int n;
int main(){
    scanf("%d",&n);
    for(register int i=1;i<=n;i++) scanf("%lf",&a[i]);
    sort(a+1,a+n+1);
    double ans=0;
    for(register int i=n;i>=1;i-=2) ans+=(acos(-1)*(a[i]*a[i]-a[i-1]*a[i-1]));
    printf("%.3lf",ans);
}

T2

题目描述

不好描述,而且能咋描述?

数据范围

根据我的代码,我猜测那个数据范围是 1 0 5 10^5 105

题解

直接搜一遍就行了。

代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],n,m,k;
int main(){
    scanf("%d %d %d",&n,&m,&k);
    for(register int i=1;i<=n;i++) scanf("%d",&a[i]);
    int ans=1e9;
    for(register int i=1;i<=n;i++){
        if(a[i]==0) continue;
        if(k>=a[i]) ans=min(ans,abs(m-i));
    }
    printf("%d",ans);
}

T3

题目描述

01 背包模板,不说了

代码
#include<bits/stdc++.h>
using namespace std;
const int N=5e3+5;
int dp[N][N],a[N],b[N],n,m;
int main(){
    scanf("%d %d",&n,&m);
    for(register int i=1;i<=n;i++) scanf("%d %d",&a[i],&b[i]);
    for(register int i=1;i<=n;i++){
        for(register int j=0;j<=m;j++){
            if(j>=a[i]) dp[i][j]=max(dp[i-1][j-a[i]]+b[i],dp[i][j]);
            dp[i][j]=max(dp[i][j],dp[i-1][j]);
        }
    }
    printf("%d",dp[n][m]);
}

T4

题目描述

自己去看原题去(

题解

贪心证明好复杂。

先摆出最优策略:将 l , r l,r l,r 全部从小到大排序,每次加上 max ⁡ ( l i , r i ) + 1 \max(l_i,r_i)+1 max(li,ri)+1

一个不合规的证明:我们假定 j j j 正在准备入座,前面入座了 i i i,那么我们需要在他们俩中间安排的空座位是 max ⁡ ( r i , l j ) \max(r_i,l_j) max(ri,lj)。那么显然我们会多余一部分,这个时候我们希望极致的利用这个值,将多余的减到最小。

经过一番推导,我们发现一定有小的 l , r l,r l,r 互相匹配,大的 l , r l,r l,r 互相匹配,所以我们可以对 l , r l,r l,r 分别排序,按顺序取。

代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
int l[N],r[N],n;
signed main(){
    scanf("%lld",&n);
    for(register int i=1;i<=n;i++) scanf("%lld %lld",&l[i],&r[i]);
    sort(l+1,l+n+1),sort(r+1,r+n+1);
    int ans=n;
    for(register int i=1;i<=n;i++) ans+=max(l[i],r[i]);
    printf("%lld",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值