#
這道題目的意思是,給你一個長為a寬為b的球桌,現在給它一個初速度,使得它在若干次碰撞后回到初始位置(題目里默認為小桌的中心)
現在告訴你小球和垂直邊碰撞的次數m,以及和水平邊碰撞的次數n,還有整個過程的時間s,讓你求出碰撞的初速度以及出球的角度;
列方程求解:
b*n=v*sin(θ)*s
a*m=v*cos(θ)*s
所以得到
tan(θ)=(b*n)/(a*m);
可解出θ;
然后在代入原方程求解v即可;
#include<iostream>
#include<cmath>
using namespace std;

const double Pi=3.141592653;

int main ()


{

double a,b,s,m,n;
while(scanf("%lf%lf%lf%lf%lf",&a,&b,&s,&m,&n))

{
if(a==0&&b==b&&s==0&&m==0&&n==0)
break;
double degree;
double resultdegree;
degree=atan(b*n/(a*m));
resultdegree=atan(b*n/(a*m))/Pi*180;
double v;
v=(b*n)/(sin(degree)*s);
printf("%.2lf %.2lf\n",resultdegree,v);
}
system("pause");
return 0;
}
這個題居然要用到三維坐標,太神奇了~
這個代碼其實我也是借鑒網上牛人寫的,感覺寫的非常好,略作修改之后就拿過來了;
至于那個坐標公式,還有一小部分沒有弄懂,下次可以繼續研究下呵;
每個點都可以用三向坐標來表示
最短路徑=兩點各坐標差的絕對值之和決定的。用三向坐標
表示后,你會發現最短路徑總是穿過3種線段,步數=各線段和=坐標差之和.有時侯把圖轉過幾個角度或把元素分分類或掠取幾條線都可能有新發現。

以上轉自:
http://hi.baidu.com/sunshine_0316/blog/item/834b3f39b58f3622b9998f6f.html
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;

int main()


{
int n1,n2;
int i,alevel,aright,aleft,blevel,bright,bleft,steps;

scanf("%d%d",&n1,&n2);
alevel=1;
blevel=1;
for(i=1;;i=i+2)

{
if(n1-i<=0)

{
aright=(i-n1)/2+1;
aleft=(n1+1)/2;
break;
}
alevel++;
n1=n1-i;
}
for(i=1;;i=i+2)

{
if(n2-i<=0)

{
bright=(i-n2)/2+1;
bleft=(n2+1)/2;
break;
}
blevel++;
n2=n2-i;
}
steps=abs(alevel-blevel)+abs(aleft-bleft)+abs(aright-bright);
printf("%d\n",steps);

return 0;
}
這道題和3620基本上是一樣的,記得當是我做3620的時候,收獲真是大啊,不過現在只能用水題來形容這道3051了,呵呵。
要讓更多的題目成為水題,這也是我的目標;
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;

char input[2000][2000];
int val[2000][2000];
int num;


void dfs(int x,int y)


{

if(val[x][y]==0)
return;
else if(val[x][y]==1)

{
val[x][y]=0;
num++;
dfs(x,y+1);
dfs(x+1,y);
dfs(x,y-1);
dfs(x-1,y);

}

}



int main ()


{
int w,h;
int i,j;
char temp;
int max=0;
num=0;
scanf("%d%d",&w,&h);
cin.ignore();
for(i=1;i<=h;i++)

{

for(j=1;j<=w;j++)

{

cin>>temp;
if(temp=='*')
val[i][j]=1;
else
val[i][j]=0;
}
}
for(i=1;i<=h;i++)


{
for(j=1;j<=w;j++)

{
num=0;

dfs(i,j);
if(num>max)
max=num;

}
}
printf("%d\n",max);


return 0;
}

摘要: 題目大意:這道題是中文的,題意就略了吧;我的思路是:先把字符串里面的-過濾掉,然后再用轉換函數,將字符映射到響應的數字,然后排序,記錄,輸出結果;開始我本來打算用map容器來做這個題的,可是discuss里面說這個方法容易超時,所以最后還是選用了if語句,雖然長一點但是保證效率,呵呵;心得嘛,我發現百度上寫的那篇關于sscanf用法的文章有誤,我在這里給它修正一下,那里提到過周星星同學的用法,里面...
閱讀全文