不知道 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);
}