wxy 4.2 # 13

v>

wxy 4.2 # 13
A
签到
B
先写了B,但是因为考虑不全面,WA了。。三发,然后自闭了然后去写C,C是一个思维题,可能由受
到B的影响,然后一直想不出来,。。,比赛就卡在这个地方,卡了将近一个小时。。。
B卡的地方就是,的确是要按照增价来排序,但是还要考虑原价,就是每单位原价所造成的收益越多越
好,其实还是应为一开始就没有正确理解题意,然后思路有问题。如果这道题不是真的没有思路可以考
虑,靠猜出题人题意的话,一定要想清楚每一个环节。列出影响最终结果的变量综合考虑。
# include <bits/stdc++.h>
using namespace std;
double pri[1100][100];
struct Node{
int data;
double c;
double pre;
};
vector<Node> v;
int cmp(Node a,Node b)
{
if(a.data==b.data){
return a.c>b.c;
}
return a.data<b.data;
}
int main()
{
int n,m; scanf("%d%d",&n,&m);
double d; scanf("%lf",&d);
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j){
scanf("%lf",&pri[i][j]);
if(j!=1){
Node a;
a.data=j;
a.pre=pri[i][j-1];
a.c=pri[i][j]-pri[i][j-1];
a.c=a.c/a.pre;
v.push_back(a);
}
}
}
sort(v.begin(),v.end(),cmp);
int len=v.size();
int nodata=1;
for(int i=0;i<len;++i){
if(v[i].data==nodata) continue;
else{C
题意:a,a+1 ...b 能组成d,问最小的b是多少。一开始拿到题目,想的是裴蜀定理,ax+by=gcd(a,b)对任
意的a,b一定存在x,y有解,但这个地方要不就取一个数要不就不取,没有取负数个数的取法,所以不
对。后面快放弃的时候发现,先用a去限定b的范围,那么b对当前这个a来说最大就是b-a* ((d/a)-1),可
以发现和a相差不了多少,然后再又走到一个思维的怪区,想着暴力用dfs去做,然后T了,QAQ。再后
面想反正b最大不会和a差很多,那么就是先用d减去尽量多的a,设n=d/a,然后剩下的就是一个比较小
的数,那么不管最后每份是多少,份数都一定不会超过n,那么可以 (d-n* a)/n 向上取整,就是(d-n*
a+n-1)/n 这个就是每份的数目,然后 d-n * a 除以这个数就是分数, 然后把a+每份的数目就是b
D
设E[x ]为当已经抛出x次1朝上时,直至出现连续k次1朝上所需的期望次数
E[k ]=0;
E[k-1]= 1+(k-1)/k* E[0]+1/k* E[k];
...
E[0]=1+(k-1)/k* E[0]+1/k* E[1];
最前面的1表示一定要投一次才会发生状态转移
然后再化解得到 E[0]= k^n+k^(n-1)+.... +k
if(v[i].c<=1e-8){
continue;
}
double n=d/v[i].pre;
//cout<<d<<" "<<v[i].pre<<endl;
d+=v[i].c*n*v[i].pre;
nodata=v[i].data;
}
}
printf("%.2f\n",d);
return 0;
}
# include <bits/stdc++.h>
using namespace std;
int main()
{
int a,d; scanf("%d%d",&a,&d);
int n=d/a;
int c=d-a*n;
printf("%d\n",a+(c+n-1)/n);
return 0;
}
# include <bits/stdc++.h>
using namespace std;
int main()
{打表
long double
cin读入,Lf输出,会花上更多时间,谨慎使用。
E
补题的时候题目读错了。。。QAQ,题目真的不能读出啊,好影响思路的。一开始思路是对的,但是应
为读错题以为求的是最少的星球。。。然后歪掉了,题意读对之后直接否定了原来的解法,其实下次如
果真的题目读错了应该在原来想到的基础上看看能不能改,第一感觉想出来的算法基本是最对的。
题目给定一些三维的点,x,y,z,r,要求让这些点的范围都不相交,且被覆盖,半径可变为原来的三倍。
那么只要先按照半径排序,然年后把相交的放到半径大的里面去,即标记为1,半径大的标记为2,然后
下次就不会再访问到了,最后输出标记为2的一共有多少点即可。
int k,n; scanf("%d%d",&k,&n);
int ans=0,d=k;
for(int i=1;i<=n;++i){
ans+=d;
d*=k;
}
printf("%d\n",ans);
return 0;
}
# include <bits/stdc++.h>
using namespace std;
long double f[20][10];
long double test(int k,int n)
{
long double ans=0.0;
f[0][0]=f[0][9]=1;
for(int i=1,last=0;;++i,last^=1){
f[last^1][0]=f[last][9]*(k-1)/k;
for(int j=1;j<=n;++j){
f[last^1][j]=f[last][j-1]/k;
}
f[last^1][9]=f[last][9]-f[last^1][n];
if(f[last^1][n]>0&&f[last^1][n]<1e-18) break;
ans+=f[last^1][n]*i;
}
return ans;
}
int main()
{
int k,n; scanf("%d%d",&k,&n);
printf("%lf\n",test(k,n));
return 0;
}
# include <bits/stdc++.h>
using namespace std;struct Node{
int x,y,z,r,id;
}node[200];
int cmp(Node a,Node b)
{
return a.r>b.r;
}
int cal(Node a,Node b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z);
}
int ans=0;
int f[200];
int main()
{
int n; scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d%d%d%d",&node[i].x,&node[i].y,&node[i].z,&node[i].r);
node[i].id=i;
}
sort(node+1,node+n+1,cmp);
for(int i=1;i<=n;++i){
if(f[i]) continue;
f[i]=2;
for(int j=i+1;j<=n;++j){
if(f[j]) continue;
if(cal(node[i],node[j])<(node[i].r+node[j].r)*(node[i].r+node[j].r))
{
f[j]=1;
}
}
}
for(int i=1;i<=n;++i){
if(!f[i]){
printf("NO\n");
return 0;
}else if(f[i]==2) ans++;
}
printf("%d\n",ans);
for(int i=1;i<=n;++i){
if(f[i]==2) printf("%d ",node[i].id);
}
return 0;
}
读完题目之后真的要再摘出来确定一边,不要因为语言问题然后就含糊了题意。
posted @ 2022-02-27 13:13  fengzlj  阅读(23)  评论(0)    收藏  举报