#include<bits/stdc++.h>
using namespace std;
int main()
{
string a,b;
cin>>a;
int len=a.size();//printf("%d\n",len);
int c=0;
for(int i=len/2+(len%2)-1,j=i+1;i>=0;i--,j++){
printf("%c",a[i]);
if(j<len) printf("%c",a[j]);
}printf("\n");
}
给出 n k 求 x 找出最小满足的x
(int)(x/k)*(x%k)=n;
数学题,简单模拟一下就知道 在【x-,1】之间找可以被 n%i==0
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
scanf("%d%d",&n,&k);
int x1=1,x2=k;
for(int i=k-1;i>=2;i--){
if(n%i==0) {
x1=i;break;
}
}x2=n/x1;//printf("%d %d\n",x1,x2);
// if(x1>x2) swap(x1,x2);
printf("%d\n",x2*k+x1);
}
题意:给出图中的三个点,求联通三个点的最小面积,以及面积包含的点
按照X从小到大排序,然后先把中间的那条路先铺好,然后再铺左右两边的路;
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
} a[4],ans[2005];
bool cmp(node a,node b)
{
return a.x<b.x;
}
int main()
{
int y1=2000,y2=0;
for(int i=1; i<=3; i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
y1=min(y1,a[i].y);
y2=max(y2,a[i].y);
}
sort(a+1,a+1+3,cmp);
int c=0;
for(int i=a[2].x,j=y1; j<=y2; j++) ans[++c]=node{i,j};
for(int i=a[1].x,j=a[1].y; i<a[2].x; i++) ans[++c]=node{i,j};
for(int i=a[2].x+1,j=a[3].y; i<=a[3].x; i++) ans[++c]=node{i,j};
printf("%d\n",c);
for(int i=1; i<=c; i++)
{
printf("%d %d\n",ans[i].x,ans[i].y);
}
D - Minimum Diameter Tree |
思维题;给出一个无向边的树和一个边权总值s,将s分散在所有的边上作为边权(si>=0);
使得树上任意两点的之间路径的边权和的最大值最小;
#include<bits/stdc++.h>
using namespace std;
int d[100005];
int main()
{
int n,m,u,v;
scanf("%d%d",&n,&m);
for(int i=1;i<=n-1;i++){
scanf("%d%d",&u,&v);
d[u]++;d[v]++;//入度++
}int c=0;
for(int i=1;i<=n;i++)
if(d[i]==1) ++c;//最外围的点
printf("%0.15lf\n",2.0*m/c);//两端的两条权值为(m/c)*2,其余中间的边全为0
}