(无法还原原题描述,根据个人理解简化了题目的描述。希望没有歧义,如有错误敬请包含。)
(提供的前两题代码已通过全部测试,已被Accepted。但是期望更好的解答,望高手不吝赐教,如能留下更好理解或性能更优的代码,将不胜感激。)
第一题:
从坐标原点(0,0)出发到目的地(dx,dy)的最快时间计算。可以直接步行走到目的地,也可以先走到附近的车站,然后坐车到目的地。
x或y轴的一个单位走路时间为WalkTime,坐车单位花费时间为TextTime;
n代表附近车站个数,tx[n]和ty[n]分别保存附近车站的坐标。
代码:
#include <iostream>
using namespace std;
int main() {
unsigned int n;
cin>>n;
int *tx=new int[n];
int *ty=new int[n];
for(unsigned int i=0;i<n;i++)
cin>>tx[i];
for(unsigned int i=0;i<n;i++)
cin>>ty[i];
int gx,gy,WalkTime,TextTime;
cin>>gx>>gy;
cin>>WalkTime>>TextTime;
int ans=(abs(gx)+abs(gy))*WalkTime;
for(unsigned int i=0;i<n;i++)
{
int tmp=(abs(tx[i])+abs(ty[i]))*WalkTime+(abs(gx-tx[i])+abs(gy-ty[i]))*TextTime;
if(tmp<ans)
ans=tmp;
}
cout<<ans;
/*int *ans=new int[n+1];
for(unsigned int i=0;i<n;i++)
{
ans[i]=(abs(tx[i])+abs(ty[i]))*WalkTime+(abs(gx-tx[i])+abs(gy-ty[i]))*TextTime;
}
ans[n]=(abs(gx)+abs(gy))*WalkTime;*/
/*for(unsigned int i=0;i<n+1;i++)
{
cout<<ans[i];
}*/
system("pause");
}
第二题:
将只包含字符G和B的字符串,其中的G单独放一起,B单独放一起;只能相邻元素两两交换,求最少的交换次数
例子:将GGBBG变为GGGBB,最少交换2次
代码:(其实还有一种思路,将G存储为0,将B存储为1;利用冒泡排序,记录交换次数。升序和降序各排一次,记录较小的交换次数。)
#include <iostream>
#include<string>
using namespace std;
int main() {
string s;
int ans=0;
cin>>s;
string s2=s;
for(unsigned i=0;i<s.size();i++)
{
int cc=0;
while(i<s.size()&&s[i]=='G')i++;
int index=i;
//cout<<index<<endl;
while(i<s.size()&&s[i]=='B'){cc++;i++;}
int index1=i;
if(i==s.size())break;
if(s[i]=='G'){i=0;}
ans+=cc;
s[index]='G';
s[index1]='B';
}
int ans2=0;
s=s2;
for(unsigned i=0;i<s.size();i++)
{
int cc=0;
while(i<s.size()&&s[i]=='B')i++;
int index=i;
//cout<<index<<endl;
while(i<s.size()&&s[i]=='G'){cc++;i++;}
int index1=i;
if(i==s.size())break;
if(s[i]=='B'){i=0;}
ans2+=cc;
s[index]='B';
s[index1]='G';
}
if(ans2<ans)ans=ans2;
//int ans2;
cout<<ans;
system("pause");
}
第三题:(由于时间限制,本人没能写完这个程序并提交,所以不知道是否能被Accepted)
输入一个整数数组a和元素个数n,循环一次更新数组元素为:a[i]=a[i]+a[i+1],其中a[-1]=a[n-1]+a[0]。输出循环k次后的数组元素。
代码:
(暴力解决,时间复杂度O(n*k),空间复杂度O(1),可能会超时)
#include<iostream>
using namespace std;
void fun();
int main()
{
int n,k;
cin>>n;
int *a=new int[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
cin>>k;
for(int i=0;i<k;i++)
{
int tmp=a[0];
for(int i=0;i<n-1;i++)
{
a[i]=a[i]+a[i+1];
}
a[n-1]=a[n-1]+tmp;
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
delete[] a;
system("pause");
return 0;
}
利用杨辉三角优化代码:
//优化一下,杨辉三角第k层
#include<iostream>
#include<time.h>
using namespace std;
void k_YangHui(int k);//计算杨辉三角的第k+1行数据,并存入全局变量YangHui
int XLCheng(int* a,int n,int start_index,int* coeef,int k);//数组a,有n个元素,从start_index下标开始,此后k个数与数组coeef的相乘求和(向量成绩)
int* YangHui;
int k;
int main()
{
time_t begin,stop;
begin=clock();
int n;
cin>>n;
int *a=new int[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
cin>>k;
k_YangHui(k);
//for(int i=0;i<k+1;i++)
//{
// cout<<YangHui[i];
//}
// cout<<endl;
int *b=new int[n];
for(int i=0;i<n;i++)
{
b[i]=a[i];
}
for(int i=0;i<n;i++)
{
a[i]=XLCheng(b,n,i,YangHui,k);
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
delete[] a,b,YangHui;
stop=clock();
double during=double(stop-begin)/CLOCKS_PER_SEC;
cout<<"\n运行时间:"<<during<<"s";
system("pause");
return 0;
}
void k_YangHui(int k)
{
int row=0,col=0,left=0,right=0;
YangHui=new int[k+1];
for(int i=0;i<k+1;i++)
YangHui[i]=1;
for(;row<k;row++)
{
left=0;
for(col=0;col<=row;col++)
{
right=YangHui[col];
YangHui[col]=left+right;
left=right;
}
}
}
int XLCheng(int* a,int n,int start_index,int* coeef,int k)
{
int i=start_index;
int sum=0;
for(int j=0;j<k+1;j++)
{
i=i%n;
sum+=a[i++]*coeef[j];
}
//cout<<sum<<endl;
return sum;
}