冬休みのACMトレーニング(一)
2866 ワード
今日からACMトレーニングを始め、劉汝佳の「プログラミングに挑戦する」を選び、しばらくは始まりました.
評価サイト:
http://www.programming-challenges.com
最初のテーマは水です.3n+1.
間もなく水が出てくるので、完全に意味通りに書けばいいです.コードも勝手です.
実は私は最初から正しいことを書いて、知識の提出の方式は書き間違えて、楞はどうして思い出せないで、もう一度提出して過ぎました.
肝心なのは少しマスターして、むやみに仮定しないでください、i,jに順序があると思ったら、明らかにAが出てこない(しかし実は直接ソートすることもできなくて、また出力するためです.)
第二題は、雷を掃くということで、また水の問題で、見るとどうすればいいか分かります.しかも明らかに時間の問題を考慮する必要はなく、100*100の最悪の状況である.
しかし、最初は次のようにエッジの境界を越えてどうするか考えていましたが、後で、私が書いたパクリを思い出して星を滅ぼすのは、エッジ配列を浪費する策略を採用し、判断を避けることです.
その後、図書館の本は本当に穴のお父さんで、本の前の読者を借りて、「最後の行にスペースがないことに注意してください」と書いた.私は要求した「空行」を「スペース」と見なした.
巨坑のお父さん、私が原題を見たまで.小さな間違いはみな人の子弟を誤魔化すだろう.私は3回提出した.初めてはField#を忘れました.2回目はいわゆる「スペース」の問題です.
3番目の問題はThe trip.最初は欲張りアルゴリズムだと思っていましたが、本当のところ、これは平均数の問題にすぎません.人の説明を見て、どうすればいいか分かりました.
実は面倒でもなく、主に「1点差を許容できる」ということで、長い間見ていました.
評価サイト:
http://www.programming-challenges.com
最初のテーマは水です.3n+1.
間もなく水が出てくるので、完全に意味通りに書けばいいです.コードも勝手です.
実は私は最初から正しいことを書いて、知識の提出の方式は書き間違えて、楞はどうして思い出せないで、もう一度提出して過ぎました.
肝心なのは少しマスターして、むやみに仮定しないでください、i,jに順序があると思ったら、明らかにAが出てこない(しかし実は直接ソートすることもできなくて、また出力するためです.)
#include<iostream>
using namespace std;
int main(){
int i,j,a,p,q;
while(cin>>i>>j){
p=i;
q=j;
if(i>j){ //swap
a=i;
i=j;
j=a;
}
int maxC=0;
for(int k=i;k<=j;k++){
a=k;
int count=1;
while(a!=1){
if(a%2==0) a/=2;
else a=a*3+1;
count++;
}
if(count>maxC)
maxC=count;
}
cout<<p<<" "<<q<<" "<<maxC<<endl;
}
return 0;
}
第二題は、雷を掃くということで、また水の問題で、見るとどうすればいいか分かります.しかも明らかに時間の問題を考慮する必要はなく、100*100の最悪の状況である.
しかし、最初は次のようにエッジの境界を越えてどうするか考えていましたが、後で、私が書いたパクリを思い出して星を滅ぼすのは、エッジ配列を浪費する策略を採用し、判断を避けることです.
その後、図書館の本は本当に穴のお父さんで、本の前の読者を借りて、「最後の行にスペースがないことに注意してください」と書いた.私は要求した「空行」を「スペース」と見なした.
巨坑のお父さん、私が原題を見たまで.小さな間違いはみな人の子弟を誤魔化すだろう.私は3回提出した.初めてはField#を忘れました.2回目はいわゆる「スペース」の問題です.
#include<iostream>
#include"string.h"
using namespace std;
#define N 110
int a[N][N];
void add(int i,int j){
if(a[i][j]>=0)
a[i][j]++;
}
int main(){
int n,m,i,j;
char tmp;
int first=0;
while(cin>>n>>m&&(n||m)){
memset(a,0,sizeof(a));
// 1,1 。
for(i=1;i<=n;i++)
for( j=1;j<=m;j++){
cin>>tmp;
if(tmp=='*'){
a[i][j]=-1;
for(int k=-1;k<2;k++)
for(int l=-1;l<2;l++)
if(k!=0||l!=0)
add(i+k,j+l);
}
}
if(first!=0){
cout<<endl;
}
first++;
//print
cout<<"Field #"<<first<<":
";
for(i=1;i<=n;i++){
for( j=1;j<=m;j++){
if(a[i][j]>=0)
cout<<a[i][j];
else
cout<<"*";
}
cout<<endl;
}
}
return 0;
}
3番目の問題はThe trip.最初は欲張りアルゴリズムだと思っていましたが、本当のところ、これは平均数の問題にすぎません.人の説明を見て、どうすればいいか分かりました.
実は面倒でもなく、主に「1点差を許容できる」ということで、長い間見ていました.
#include<iostream>
using namespace std;
#define N 1020
double s[N];
int main(){
int n,i;
while(cin>>n&&n){
double res1=0,res2=0,sum=0;
for( i=0;i<n;i++){
cin>>s[i];
sum+=s[i];
}
sum=(int)((sum/n)*100+0.5);
sum=sum/100;
for( i=0;i<n;i++){
if(s[i]<sum){
res1+=sum-s[i];
}else{
res2+=s[i]-sum;
}
}
cout.precision(2);
cout.setf(ios::fixed | ios::showpoint);
cout << "$" ;
if(res1>res2)
cout<<res2;
else{
cout<<res1;
}
cout<<endl;
}
return 0;
}