A. Right-Left Cipher(暴力)
题目链接:https://codeforces.com/contest/1087/problem/A
题目大意:一串字符串,输入方式是:先s0,然后后面输入s1,前面输入s2,后面输上s3.。。给出你这样输入的一个字符序列,让你输出它的原来的字符串;
思路:直接模拟即可:
AC:
char s[MAXN];
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>s)
{
int l=strlen(s);
if(l%2==0)
{//ż��
int res=l/2-1;
cout<<s[res];
for(int i=1;i<l/2;++i)
cout<<s[res+i]<<s[res-i];
cout<<s[l-1]<<endl;
}
else
{//����
int res=l/2;
if(res==0)
{
cout<<s[res]<<endl;
continue;
}
cout<<s[res];
for(int i=1;i<=l/2;++i)
cout<<s[res+i]<<s[res-i];
cout<<endl;
}
clean(s,'\0');
}
}
B. Div Times Mod(暴力)
题目链接:https://codeforces.com/contest/1087/problem/B
题目大意:解出方程:(x/k)*(x%k)=n的最小值x。x可以整除k。输入n([1,1e6])和k[2,1e3]
思路:暴力,首先方程化简,然后遍历一遍x%k的结果。然后从中找出符合要求的最小值x。
AC:
int main()
{
std::ios::sync_with_stdio(false);
int n,k;
while(cin>>n>>k)
{
int res=n*k,ans=INF;
for(int i=k-1;i>=1;--i)
{//xȡģ�����λ i
if(res%i==0)
{//x������
int x=res/i;//��ֵx
x=x+i-(x%k);
//cout<<x<<endl;
if((x/k)*(x%k)==n)
ans=min(ans,x);
}
}
cout<<ans<<endl;
}
}
C. Connect Three(思维,规律)
题目链接:https://codeforces.com/contest/1087/problem/C
题目大意:在一个网格中,有三个点,问如何得出一个路径使这三个点联通&&路径最短,然后输出路径。
思路:看成一个矩形,很明显,路径就是这个矩形的长和宽,我们从一个点出发,延该店的纵坐标向中间点靠近,然后从另一点出发,延纵坐标向中间点靠近,然后从中间点的横坐标,直接连接两个点的纵坐标即可。注意可能覆盖,因此两边的都为[,),上下的为[,]。
AC:
int x[5],y[5],really[MAXN];
int main()
{
std::ios::sync_with_stdio(false);
//���еĵ�ķֲ�������ת���� T ���ͷֲ� ������x1->x2 x2<-x3 Ȼ�� ��x2����y1->y3
for(int i=1;i<=3;++i)
{
cin>>x[i]>>y[i];
really[x[i]]=y[i];
}
sort(x+1,x+4);
sort(y+1,y+4);
cout<<x[3]-x[1]+y[3]-y[1]+1<<endl;
for(int i=x[1];i<x[2];++i)//��1��ʼ�ߵ�2������
cout<<i<<" "<<really[x[1]]<<endl;
for(int i=x[3];i>x[2];--i)//��3��ʼ�ߵ�2������
cout<<i<<" "<<really[x[3]]<<endl;
for(int i=y[1];i<=y[3];++i)//���������ߵ�������
cout<<x[2]<<" "<<i<<endl;
}
全部评论
(0) 回帖