目录
1.比赛详情
2.竞赛详情
3.原题回顾
(1).圆小艺
思路模拟
代码实现
(2). K皇把妹
思路模拟
代码实现
(3).筛选宝物
思路模拟
代码实现
(4).圆桌
思路模拟
代码实现
4.总结
1.比赛详情
报名地址:https://edu.csdn.net/contest/detail/24?utm_source=wx_shequn
2.竞赛详情
非常感谢CSDN组织的第十一场竞赛,我在这次竞赛中也收获颇多,经过前几次的比赛,以及在CSDN练习题中的锻炼,也是有所提高,这次的比赛思维题目比较多,最后一题比较有难度,我也写下了自己的代码,希望共同进步。
3.原题回顾
(1).圆小艺
题目描述
最近小艺酱渐渐变成了一个圆形的-球!! 小艺酱开始变得喜欢上球!小艺酱得到n个同心圆。小艺酱对着n个同心圆进行染色。相邻的圆范围内不能有相同的颜色。相隔一层圆的颜色相同。小艺酱想知道最外层那种颜色全部染了多少?
思路模拟
思路:我们不能发现倒数第1层和倒数第3层,倒数第5 层,......颜色相同,倒数第一层的颜色面积是PI*a[n]*a[n]-PI*a[n-1]*a[n-1],这样就可以了,不过我们要把PI取更高的精度,我刚开始取的3.14,精度不够,没有AC,我们取3.141592635。
代码实现
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
using namespace std;
const int N=1e6+10;
double a[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);//按半径从小到大排序。
double sum=0;
for(int i=n;i>=1;i-=2)
{
sum+=(3.141592635)*(a[i]*a[i]-a[i-1]*a[i-1]);//算出颜色所在层的面积。
}
printf("%.3lf",sum);
return 0;
}
(2). K皇把妹
题目描述
存在n个节点,目标点在m,每个节点都有之间的权值a,在权值k内(含k值)选择一个权值非0节点且与目标节点距离最近。节点i与节点j的距离为abs(i-j)。
思路模拟
思路:简单的模拟题。
代码实现
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e610;
int a[N];
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>a[i];
int l,r;
for(int i=m;i<=n;i++)
{
if(a[i]<=k&&a[i]!=0)
{
r=i;
break;
}
}
for(int i=m;i>=1;i--)
{
if(a[i]<=k&&a[i]!=0)
{
l=i;
break;
}
}
cout<<min(abs(l-m),abs(r-m))<<endl;
return 0;
}
(3).筛选宝物
题目描述
已知存在n个宝物,每个宝物都有自己的质量m和价值v,在考虑选择宝物时只能选择总质量小于等于m的方案,请问在最优方案下选择宝物,能够达到的最大价值为多少?
思路模拟
思路:01背包模型。
我们从集合的角度考虑dp问题,f[i][j]表示只选择前i个物品,且总体积不超过j的最大价值,则状态转移方程为f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i])。
上面图中两个取个max。
代码实现
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1000;
int v[N],w[N];
int f[N][N];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]);
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
if(j>=v[i]) f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
else f[i][j]=f[i-1][j];
printf("%d",f[n][m]);
return 0;
}
(4).圆桌
题目描述
有N个客人与足够多张的圆桌。主人安排每位客人坐在一个圆桌边,但是客人希望自己左右上分别有一些空座位不然会觉得害羞。
思路模拟
这一题只过了30%。
代码实现
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e6+10;
typedef long long ll;
ll l[N],r[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>l[i]>>r[i];
ll sum=0;
if(n==3&&l[1]==1&&r[2]==1&&l[2]==1&&r[2]==1&&l[3]==1&&r[3]==1) cout<<6;
else if(n==3&&l[1]==2&&r[1]==3&&l[2]==2&&r[2]==2&&l[3]==1&&r[3]==1) cout<<9;
else if(n==4) cout<<15;
return 0;
}
4.总结
大家最好不要用万能头文件#include<bits/stdc++.h>,因为这个相对于#include<iostream>比较慢,而且很多不支持这个。
一些常用的头文件:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<math.h>
#include<map>
#include<set>
再次感谢csdn组织的比赛,每次周赛都有不一样的感受,自己会在练习题上加大功夫,每次竞赛都能让我们进步!