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; } 读完题目之后真的要再摘出来确定一边,不要因为语言问题然后就含糊了题意。
上一篇:c#DataGridView数据绑定示例——格式化单元格的内容(转)


下一篇:项目开发中Git中配置忽略上传文件