[HihoCoder-1696]
计算折线的中点。(题号hihocoder)
思路:先计算折线的总长度,然后算出一半的长度,然后后面对每段折线进行求和,只要和值小于一半就继续求和,知道大于等于如果大于则通过多出来的部分,然后根据勾股定理(余弦定理,正弦定理)算出中点的x值,y值。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1e6+50;
int n;
double seg[maxn],length,mid,ans_x,ans_y,Sin[maxn],Cos[maxn];
struct Node{
int x,y;
}node[maxn];
int main(){
while(scanf("%d",&n)!=EOF){
memset(node,0,sizeof(node));
memset(seg,0,sizeof(seg));
memset(Cos,0,sizeof(Cos));
memset(Sin,0,sizeof(Sin));
length=0;
for(int i=0;i<n;i++){
scanf("%d%d",&node[i].x,&node[i].y);
if(i>0){
int dx=node[i].x-node[i-1].x;
int dy=node[i].y-node[i-1].y;
seg[i]=sqrt(dx*dx+dy*dy);
length+=seg[i];///seg 从1开始
Sin[i]=dy/seg[i],Cos[i]=dx/seg[i];
}
}
mid=length/2;
length=0;
for(int i=1;i<n;i++){
if(length+seg[i]>=mid){
if(length+seg[i]==mid){
ans_x=node[i].x,ans_y=node[i].y;
break;
}
double temp=length+seg[i]-mid;
double yy=temp*Sin[i];
double xx=temp*Cos[i];
ans_x=node[i].x*1.0-xx,ans_y=node[i].y*1.0-yy;
break;
}
length+=seg[i];
}
printf("%.1f %.1f\n",ans_x,ans_y);
}
return 0;
}
[HihoCoder-1697]
思路:直接递归构造。因为先序遍历是 根节点-左子树-右子树,每次找最小的数作为当前子树的根节点,然后根据中序遍历左子树在左边,右子树在右边,先递归遍历左边,再递归遍历右子树。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e6+50;
int node[maxn],n;
void dfs(int l,int r){
if(l==r) return;
int t=l;
for(int i=l;i<r;i++) if(node[i]<node[t]) t=i;
printf("%d\n",node[t]);
dfs(l,t);
dfs(t+1,r);
}
int main(){
while(scanf("%d",&n)!=EOF){
memset(node,0,sizeof(node));
for(int i=0;i<n;i++)
scanf("%d",&node[i]);
dfs(0,n);
}
return 0;
}
[CodeChef-C3PBR3]
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e4+50;;
long long c[maxn][maxn],ans;
int temp[maxn],n;
void comb(int nn){
for(int i=0;i<=nn;i++){
c[i][0]=1;
for(int j=1;j<=nn;j++){
c[i][j]=c[i][j-1]*(i-j+1)/j;
}
}
}
int main(){
while(scanf("%d",&n)!=EOF){
comb(n);
memset(temp,0,sizeof(temp));
ans=0;
for(int i=0;i<n;i++){
scanf("%d",&temp[i]);
}
sort(temp,temp+n);
for(int i=0;i<n;i++){
for(int j=0;j<=min(i,n-i-1);j++){
ans+=c[i][j]*temp[i]*c[n-i-1][j];
}
}
printf("%d\n",ans);
}
return 0;
}