Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4)
cf 1087A
水题
#include <bits/stdc++.h>
#define cl(a) memset(a,0,sizeof(a))
#define sc(x) scanf("%lld",&x)
#define pt(x) printf("%lld\n",x)
using namespace std;
const int maxn=5e5+50;
typedef long long ll;
const int mod=1e9+7;
const ll inf=1e18;
int main()
{
string s,ans;
cin>>s;
if(s.size()%2)
{
int i=s.size()-1;
int j=0;
while(i>j)
{
ans+=s[j];
ans+=s[i];
i--;
j++;
}
if(i==j) ans+=s[i];
}
else
{
int i=s.size()-1;
int j=0;
while(i>j)
{
ans+=s[i];
ans+=s[j];
i--;
j++;
}
}
for(int i=ans.size()-1;i>=0;i--)
{
cout<<ans[i];
}
return 0;
}
codeforces 1087B
水题
#include <bits/stdc++.h>
#define cl(a) memset(a,0,sizeof(a))
#define sc(x) scanf("%lld",&x)
#define pt(x) printf("%lld\n",x)
using namespace std;
const int maxn=5e5+50;
typedef long long ll;
const int mod=1e9+7;
const ll inf=1e18;
int main()
{
int n,k;
cin>>n>>k;
int ans=0x3f3f3f3f;
for(int i=1;i<k;i++)
{
if(n%i==0)
{
// cout<<n<<" "<<i<<endl;
int t= n/i;
int x = k*t+i;
ans = min(ans,x);
//cout<<t<< " "<<x<<endl;
}
}
cout<<ans<<endl;
return 0;
}
codeforces 1087C
这个题卡了一会儿,原因是忽略他在格子中的条件,单纯想如何通过求路径,计算重复的情况了
事实上,如果在格子中,那么走的方案基本上就是走一个折角。
那么我们只要按照X排序,从a->b 先横着走,再竖着走 从b->c 先竖着走,再横着走,那么就可去掉重复的那些点了;
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
};
node a[4];
bool cmp(node a,node b)
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
vector<node>v;
int vis[1005][1005];
void getpath(node a,node b)
{
for(int i=a.x; i<=b.x; i++)
{
node t;
t.x=i;
t.y=a.y;
if(!vis[t.x][t.y])
v.push_back(t);
vis[t.x][t.y]=1;
}
if(a.y>=b.y)
{
for(int i=a.y; i>=b.y; i--)
{
node t;
t.x=b.x;
t.y=i;
if(!vis[t.x][t.y])
v.push_back(t);
vis[t.x][t.y]=1;
}
}
else
{
for(int i=a.y; i<=b.y; i++)
{
node t;
t.x=b.x;
t.y=i;
if(!vis[t.x][t.y])
v.push_back(t);
vis[t.x][t.y]=1;
}
}
}
void getpath2(node a,node b)
{
if(a.y>=b.y)
{
for(int i=a.y; i>=b.y; i--)
{
node t;
t.x=a.x;
t.y=i;
if(!vis[t.x][t.y])
v.push_back(t);
vis[t.x][t.y]=1;
}
}
else
{
for(int i=a.y; i<=b.y; i++)
{
node t;
t.x=a.x;
t.y=i;
if(!vis[t.x][t.y])
v.push_back(t);
vis[t.x][t.y]=1;
}
}
for(int i=a.x; i<=b.x; i++)
{
node t;
t.x=i;
t.y=b.y;
if(!vis[t.x][t.y])
v.push_back(t);
vis[t.x][t.y]=1;
}
}
int main()
{
for(int i=1; i<=3; i++)
{
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+4,cmp);
getpath(a[1],a[2]);
getpath2(a[2],a[3]);
cout<<v.size()<<endl;
for(int i=0; i<v.size(); i++)
{
cout<<v[i].x<<" "<<v[i].y<<endl;
}
return 0;
}
codeforces 1087D
要求最小的直径。如果在中间赋予权值,那么任意一条路径都会增加这个权值,那么这个权值与加在叶子节点上的效果是一样的,所以我们只要让所有的叶子结点平分总的权值即可。。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,s;
const int maxn=1e6+60;
int in[maxn];
int main()
{
scanf("%lld%lld",&n,&s);
int k =0;
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
in[u]++;
in[v]++;
}
for(int i=1;i<=n;i++)
{
if(in[i]==1) k++;
}
double ans = s*1.0/k *2.0;
printf("%.6f\n",ans);
return 0;
}