浙江大学の2006年の再試験の上で機械の問題の解題の報告
九度OJテーマ1015:やはりA+B
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1111解決:701
タイトルの説明:
10000未満の2つの正の整数AとBを読み込み、A+Bを計算します.なお、AとBの末尾K(8を超えない)ビット数が同じ場合は、-1を直接出力してください.
入力:
試験入力にはいくつかの試験例が含まれており、各試験例は1行を占め、フォーマットは「A B K」であり、隣接する2つの数字にはスペース間隔がある.AとBが同時に0の場合、入力が終了し、対応する結果は出力されません.
出力:
各試験例に対して1行、すなわちA+Bの値または-1を出力する.
サンプル入力:
1 2 1
11 21 1
108 8 2
36 64 3
0 0 1
サンプル出力:
3
-1
-1
100
九度OJテーマ1016:火星A+B
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1259解決:356
タイトルの説明:
25ビットを超えない2つの火星の正の整数AとBを読み込み、A+Bを計算します.火星では整数は単一進数ではなく、n位の進数はn番目の素数であることに注意しなければならない.例えば、地球上の10進数2は、火星では「1,0」と表記されています.火星の桁数は2進数だからです.地球上の10進数38は、火星では「1,1,1,0」と表記されています.火星の桁数は2進数、10桁は3進数、百桁は5進数、千桁は7進数だからです.
入力:
テスト入力にはいくつかのテスト例が含まれており、各テスト例は1行を占め、2つの火星の正の整数AとBを含み、火星の整数の隣接する2桁はカンマで区切られ、AとBの間にスペース間隔がある.AまたはBが0の場合、入力が終了し、対応する結果は出力されません.
出力:
試験例毎に1行、すなわち火星表現法のA+Bの値を出力する.
サンプル入力:
1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0
サンプル出力:
1,0,1
1,1,1,0
1,0,0,0,0,0
9度OJはこの問題に5星の最高難易度をマークしました.信じますか.数学に自信があれば、最初の26個の素数を直接書くことができます.安定を求めたり、サボったりしたい場合は、小さなプログラムを書いて、定義された配列に出力してからcopyします.
そしてビット処理大数加算で区別できるのは、従来は10進位であったが現在はodd[i]進位である
九度OJテーマ1017:やはりスムーズな工事
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:898解決:466
タイトルの説明:
ある省は田舎の交通状況を調査し、得られた統計表には任意の2つの村間の距離がリストされている.省政府の「円滑な工事」の目標は、全省のどの2つの村の間でも道路交通を実現できるようにすることである(しかし、直接的な道路がつながっているとは限らず、間接的に道路を通過すればよい)、敷設された道路の総長さを最小限に抑えることを要求している.最小の道路の全長を計算してください.
入力:
テスト入力には、いくつかのテスト例が含まれます.各試験例の1行目は、村の数N(<100)を与える.その後のN(N−1)/2行は村間の距離に対応し,各行には2つの村の番号とこの2つの村間の距離のペアの正の整数を与えた.簡単にするために、村は1からN番までです.
Nが0の場合、入力は終了し、この例は処理されない.
出力:
各試験例について、1行に最小の道路総長を出力する.
サンプル入力:
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
サンプル出力:
3
5
しばらく滞在する
九度OJテーマ1018:同成績の学生数を統計する
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1409解決:800
タイトルの説明:
N名の生徒の成績を読み込むと,ある所定の点数を獲得した生徒数が出力される.
入力:
テスト入力にはいくつかのテスト例が含まれており、各テスト例のフォーマットは
1行目:N
2行目:N人の学生の成績で、隣接する2つの数字は1つのスペースで隔てられています.
3行目:指定されたスコア
N=0と読むと入力が終了します.ここで、Nは1000を超えず、成績点数は0から100の間の整数である.
出力:
各試験例について、所定の点数の学生数出力が得られる.
サンプル入力:
3
80 60 90
60
2
85 66
0
5
60 75 90 55 75
75
0
サンプル出力:
1
0
2
九度OJテーマ1019:簡単計算機
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1476解決:500
タイトルの説明:
+、-、*、/のみを含む非負の整数計算式を読み込み、その値を計算します.
入力:
テスト入力には、各テスト・インスタンスが1行を占め、各行が200文字を超えず、整数と演算子の間にスペースで区切られたいくつかのテスト・インスタンスが含まれます.不正な式はありません.1行に0しかない場合は入力が終了し、対応する結果は出力されません.
出力:
各テストケースに1行、すなわち式の値を小数点以下2桁まで出力します.
サンプル入力:
1 + 2
4 + 2 * 5 - 7/11
0
サンプル出力:
3.00
13.36
まずgetlineで改行文字列を文字列変数lineに与え、istringstream s(line)で文字列変数sにlineを与えると、cinがコンテンツCを取得するための出力データの機能が備えられ、sscanfでchar配列を直接読めばよいので、乗除を優先して2つのスタックでオペランドとオペレータをそれぞれ保存し、最後にforループ処理を加減する
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1111解決:701
タイトルの説明:
10000未満の2つの正の整数AとBを読み込み、A+Bを計算します.なお、AとBの末尾K(8を超えない)ビット数が同じ場合は、-1を直接出力してください.
入力:
試験入力にはいくつかの試験例が含まれており、各試験例は1行を占め、フォーマットは「A B K」であり、隣接する2つの数字にはスペース間隔がある.AとBが同時に0の場合、入力が終了し、対応する結果は出力されません.
出力:
各試験例に対して1行、すなわちA+Bの値または-1を出力する.
サンプル入力:
1 2 1
11 21 1
108 8 2
36 64 3
0 0 1
サンプル出力:
3
-1
-1
100
// 2010: 1015: A+B
// 10000 A B, A+B。
// : A B K( 8) , -1。
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
int i, j, k, m, n;
int a, b;
int D[9]={0,10,100,1000,10000,100000,1000000,10000000,100000000};
ifstream cin("ZJU_1015.txt");//
while( cin >> a >> b >> k && a+b ){
if(a%D[k]==b%D[k])
cout << "-1
";
else cout << a+b << endl;
}
system("pause");
return 0;
}
九度OJテーマ1016:火星A+B
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1259解決:356
タイトルの説明:
25ビットを超えない2つの火星の正の整数AとBを読み込み、A+Bを計算します.火星では整数は単一進数ではなく、n位の進数はn番目の素数であることに注意しなければならない.例えば、地球上の10進数2は、火星では「1,0」と表記されています.火星の桁数は2進数だからです.地球上の10進数38は、火星では「1,1,1,0」と表記されています.火星の桁数は2進数、10桁は3進数、百桁は5進数、千桁は7進数だからです.
入力:
テスト入力にはいくつかのテスト例が含まれており、各テスト例は1行を占め、2つの火星の正の整数AとBを含み、火星の整数の隣接する2桁はカンマで区切られ、AとBの間にスペース間隔がある.AまたはBが0の場合、入力が終了し、対応する結果は出力されません.
出力:
試験例毎に1行、すなわち火星表現法のA+Bの値を出力する.
サンプル入力:
1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0
サンプル出力:
1,0,1
1,1,1,0
1,0,0,0,0,0
9度OJはこの問題に5星の最高難易度をマークしました.信じますか.数学に自信があれば、最初の26個の素数を直接書くことができます.安定を求めたり、サボったりしたい場合は、小さなプログラムを書いて、定義された配列に出力してからcopyします.
そしてビット処理大数加算で区別できるのは、従来は10進位であったが現在はodd[i]進位である
// 2010: 1016: A+B
// 25 A B, A+B
// , , n n
// ","
#include <fstream>
#include <memory.h>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
int odd[]={2,3,5,7,11,13,17,19,23,29,31,37,
41,43,47,53,59,61,67,71,73,79,83,89,97,101};
int a[26], b[26],c[26];
int convertToNum( string s ){
int len = s.length();
int result = s[0]-48;
for( int i=1; i<len; i++ )
result = result*10 + s[i] - 48;
//cout << "result=" << result << endl;//
return result;
}
void getNum( string s, int Bit, int d[] ){ // a[] a
int i, j, k;
string t;
if( Bit==0 ){
d[0] = s[0] - 48;
return;
}
while( Bit!=-1 ){
i=s.find(",");
//cout << s << " " << i << endl;//
d[Bit--] = convertToNum( s.substr(0,i) );
s = s.substr(i+1,s.length()-i);
}
}
int main()
{
int i, j, k, m, n;
string A, B;
int alen, blen, Abit, Bbit, maxbit;
ifstream cin("ZJU_1016.txt");//
while( cin >> A >> B && (A!="0"||B!="0") ){
Abit = Bbit = 0;
alen = A.length();
blen = B.length();
for( i=0; i<alen; i++ )
if( A[i]==',' ) Abit++;
for( i=0; i<blen; i++ )
if( B[i]==',' ) Bbit++;
maxbit = max(Abit,Bbit);
////calc odd
//int count =0;
//for( i=2; count<=25; i++ ){
// bool pass=1;
// for( j=2; j<=i>>1; j++ )
// if( i%j==0 ) { pass=0; break; }
// if(pass) { cout << i << ","; count++; }
//} cout << endl;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
getNum( A, Abit, a );
getNum( B, Bbit, b );
//cout << "A= ";
//for( i=maxbit; i>=0; i-- )
// cout << a[i] << " ";
//cout << endl;
//cout << "B= ";
//for( i=maxbit; i>=0; i-- )
// cout << b[i] << " ";
//cout << endl;
c[0] = 0; maxbit++;
for( i=0; i<=maxbit; i++ ){
a[i] = a[i]+b[i]+c[i];
c[i+1] = a[i]/odd[i]; //c[]=
a[i] %= odd[i];
}
bool flag = 0;
for( i=maxbit; i>0; i-- ){
if( flag==0 )
if( a[i] ) flag = 1;
if( flag )
cout << a[i] << ",";
}
cout << a[0] << endl;
//cout << endl;//
}
system("pause");//
return 0;
}
九度OJテーマ1017:やはりスムーズな工事
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:898解決:466
タイトルの説明:
ある省は田舎の交通状況を調査し、得られた統計表には任意の2つの村間の距離がリストされている.省政府の「円滑な工事」の目標は、全省のどの2つの村の間でも道路交通を実現できるようにすることである(しかし、直接的な道路がつながっているとは限らず、間接的に道路を通過すればよい)、敷設された道路の総長さを最小限に抑えることを要求している.最小の道路の全長を計算してください.
入力:
テスト入力には、いくつかのテスト例が含まれます.各試験例の1行目は、村の数N(<100)を与える.その後のN(N−1)/2行は村間の距離に対応し,各行には2つの村の番号とこの2つの村間の距離のペアの正の整数を与えた.簡単にするために、村は1からN番までです.
Nが0の場合、入力は終了し、この例は処理されない.
出力:
各試験例について、1行に最小の道路総長を出力する.
サンプル入力:
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
サンプル出力:
3
5
しばらく滞在する
九度OJテーマ1018:同成績の学生数を統計する
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1409解決:800
タイトルの説明:
N名の生徒の成績を読み込むと,ある所定の点数を獲得した生徒数が出力される.
入力:
テスト入力にはいくつかのテスト例が含まれており、各テスト例のフォーマットは
1行目:N
2行目:N人の学生の成績で、隣接する2つの数字は1つのスペースで隔てられています.
3行目:指定されたスコア
N=0と読むと入力が終了します.ここで、Nは1000を超えず、成績点数は0から100の間の整数である.
出力:
各試験例について、所定の点数の学生数出力が得られる.
サンプル入力:
3
80 60 90
60
2
85 66
0
5
60 75 90 55 75
75
0
サンプル出力:
1
0
2
// 2010: 1018:
// N , 。
//input:
// 1 :N
// 2 :N , 。
// 3 :
// N=0 。 N 1000, ( )0 100 。
#include <fstream>
#include <memory.h>
#include <iostream>
using namespace std;
int main()
{
int i, j, k, m, n;
int a[101];
ifstream cin("ZJU_1018.txt");//
while( cin >> n && n ){
memset(a,0,sizeof(a));
for( i=0; i<n; i++ ){
cin >> k;
a[k]++;
}
cin >> j;
cout << a[j] << endl;
}
system("pause");
return 0;
}
九度OJテーマ1019:簡単計算機
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1476解決:500
タイトルの説明:
+、-、*、/のみを含む非負の整数計算式を読み込み、その値を計算します.
入力:
テスト入力には、各テスト・インスタンスが1行を占め、各行が200文字を超えず、整数と演算子の間にスペースで区切られたいくつかのテスト・インスタンスが含まれます.不正な式はありません.1行に0しかない場合は入力が終了し、対応する結果は出力されません.
出力:
各テストケースに1行、すなわち式の値を小数点以下2桁まで出力します.
サンプル入力:
1 + 2
4 + 2 * 5 - 7/11
0
サンプル出力:
3.00
13.36
まずgetlineで改行文字列を文字列変数lineに与え、istringstream s(line)で文字列変数sにlineを与えると、cinがコンテンツCを取得するための出力データの機能が備えられ、sscanfでchar配列を直接読めばよいので、乗除を優先して2つのスタックでオペランドとオペレータをそれぞれ保存し、最後にforループ処理を加減する
// 2010: 1019:
// +, -, *, / , 。
// :
// 1 + 2
// 4 + 2 * 5 - 7 / 11
// 0
// :
// 3.00
// 13.36
#include <fstream>
#include <memory.h>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
int i, j, k, m, n;
string s, t, line;
double num[200], temp;
char op[200];
int opi, numi; //i=index
ifstream cin("ZJU_1019.txt");//
cout.precision(2);cout.setf(ios::fixed);
while( getline(cin,line) && line!="0" ){
istringstream s(line);
opi = numi = 0;
s >> num[numi];
while( s >> op[opi] >> temp ){
if( op[opi]=='*' )
num[numi]*=temp;
else if( op[opi]=='/' )
num[numi]/=temp;
else { opi++; num[++numi]=temp; }
}
//for( i=0; i<opi; i++ )
// cout << op[i];
//cout << endl;
//for( i=0; i<numi; i++ )
// cout << num[i] << " ";
//cout << endl;
for( i=0,j=0; i<opi; i++ ){
if( op[i]=='+' )
num[0]+=num[++j];
else num[0]-=num[++j];
}
cout << num[0] << endl;
}
system("pause");
return 0;
}