HDU1383 最简单的计算机
题目
题目分析
解题思路:模拟题,水题,按不同命令要求操作即可。
代码实现
#include<iostream>
#include<string.h>
using namespace std;
//简单模拟
int main()
{
int m1,m2,r1,r2,r3;
string s;
while(cin>>m1>>m2)
{
cin>>s;
r1=0;
r2=0;
r3=0;
for(int i=0; i<s.size(); ++i)
{
switch(s[i])
{
case 'A':
{
r1=m1;
break;
}
case 'B':
{
r2=m2;
break;
}
case 'C':
{
m1=r3;
break;
}
case 'D':
{
m2=r3;
break;
}
case 'E':
{
r3=r1+r2;
break;
}
case 'F':
{
r3=r1-r2;
break;
}
}
}
cout<<m1<<","<<m2<<endl;
}
return 0;
}
HDU1302 The Snail
题目
题目分析
题目大意:输入H(井深)、U(第一个白天爬升高度)、D(夜晚下降高度)、F(疲劳因子,百分比),蜗牛白天爬升,夜晚下滑,每天爬升高度比前一天减少U*F/100,如果疲劳因子使某天爬升高度降到负值,则当天不再爬升,不管白天是否爬升晚上都将下滑D。蜗牛第一天从井底开始爬,求什么时候能爬到井口(>H)或者跌回井底(<0)。
解题思路:主要就是按顺序考虑三个方面,能否爬升?爬升之后>H?夜晚是正常下滑还是失败?
注意:下降的距离和当前距离都要使用double类型。
PS:这种考虑比较多的题目一轮AC了真的。。。哈哈哈
代码实现
#include<iostream>
using namespace std;
int main()
{
int h,u,d,f;
double down;
double cdis;//当前距离
int cnt;//天数
while(cin>>h>>u>>d>>f&&h)
{
cdis=0;
down=u*f*1.0/100;//每天减少
cnt=1;
while(true)
{
if(u-down*(cnt-1)>0)
cdis=cdis+u-down*(cnt-1);
if(cdis>h)
{
cout<<"success on day "<<cnt<<endl;
break;
}
if(cdis-d>=0)
cdis-=d;
else
{
cout<<"failure on day "<<cnt<<endl;
break;
}
++cnt;
}
}
return 0;
}
HDU1303 Doubles
题目分析
题目大意
题目大意:给出一个数列,求数列中有多少组成2倍的关系。
解题思路:对于每一个数字,只考虑其之前的关系,看之前的数字中有没有这个数的2倍或者是1/2,边输入边处理就行。
注意:输入的处理,没有给出数列中数字的个数,我设了两层循环,外层是对第一个元素的处理,输入为-1时退出,内层是对之后元素的处理,输入为0时结束本次。
代码实现
#include<iostream>
using namespace std;
//注意输入的处理
int main()
{
int num[20];
int n;
int cnt,ans;
while(cin>>n&&n!=-1)
{
cnt=0;
ans=0;
num[cnt]=n;//输入第一个数
while(cin>>n&&n)
{
num[++cnt]=n;
for(int i=0; i<cnt; ++i)
{
if(num[i]==n*2||num[i]*2==n)
++ans;
}
}
cout<<ans<<endl;
}
return 0;
}
HDU1323 Perfection
题目
题目分析
题目大意:简单来说就是比较一个数和这个数所有除它本身的因数之和的大小关系,三种情况输出三种结论。
解题思路:求除本身的因数之和比较即可。
注意:输出格式和标题、结尾的输出位置。
代码实现
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int n;
int sum;
int first=1;
while(cin>>n&&n)
{
if(first)
{
cout<<"PERFECTION OUTPUT"<<endl;
first=0;
}
sum=0;
for(int i=1; i<n; ++i)
if(n%i==0)
sum+=i;
printf("%5d ",n);
if(sum==n)
cout<<"PERFECT"<<endl;
else if(sum>n)
cout<<"ABUNDANT"<<endl;
else
cout<<"DEFICIENT"<<endl;
}
cout<<"END OF OUTPUT"<<endl;
return 0;
}
HDU1326 Box of Bricks
题目
题目分析
题目大意:想要把几摞数目不同的砖堆调整为一样的高度,求砖块移动的最小次数。
解题思路:先求出调整之后每一摞的砖块数,然后遍历求所有高于标准的堆与标准堆的差再求和即可(全照低于标准的也可)。
代码实现
#include<iostream>
#include<vector>
using namespace std;
//输出之间有空行
int main()
{
int n,num,per,ans,sum;
int cnt=1;
int temp;
vector<int> v;
vector<int>::iterator it;
while(cin>>n&&n)
{
v.clear();//使用之前先清空
num=n;
sum=0;
while(n--)
{
cin>>temp;
v.push_back(temp);
sum+=temp;
}
per=sum/num;
ans=0;
for(it=v.begin(); it!=v.end(); ++it)
{
if(*it>per)
ans=ans+*it-per;
}
cout<<"Set #"<<cnt<<endl;
cout<<"The minimum number of moves is "<<ans<<"."<<endl<<endl;
++cnt;
}
return 0;
}
HDU1334 Perfect Cubes
题目
题目分析
题目大意:输出所有满足a3=b3+c3+d3且a<=200的数据集{a,b,c,d}。
解题思路:暴力枚举,注意非递减序排列。
代码实现
#include<iostream>
#include<stdio.h>
using namespace std;
//用pow会比较慢
int main()
{
int x,i,j,k;
for(x=6; x<=200; ++x)
{
int a=x*x*x;//少算很多遍
for(i=2; i<x; ++i)
for(j=i; j<x; ++j)
for(k=j; k<x; ++k)
if(i*i*i+j*j*j+k*k*k==a)
printf("Cube = %d, Triple = (%d,%d,%d)\n",x,i,j,k);
}
return 0;
}
思考
对于程序的优化问题,比如在上面最外层循环求x3,就会比放在内层循环中少算很多遍,能提高运行速度。还有刚开始我想对这个普通的循环进行优化,希望能少算一些,把判断条件改成了三次方之间的关系,比如说3*i3<x3,这样好像是能少算几个,但是每次都进行三次方的运算在这个数据量的时候会减慢运行速度,在优化算法的时候还是要综合考虑到计算量和数据量。