[ITSA] No.66 詳解
前言
簡單來說就是我特殊選才的資料不夠 所以只好來打這東西,不然備審有夠空QQ
problem 1
題目
這題就是給你一行整數(數量不定,但是保證 < 11個) 求該行出現率「超過」一半的整數
解法
看到數量不定就會用 getline + stringstream,這很直觀 然後因為他只有說「給整數」,並沒有限制數字大小 所以我是用 map 做,而不是陣列(出現負數就尷尬了) 雖然比較慢但是也比較無腦
為什麼我會在題目那把「超過」加上引號? 。。。因為我在寫 code 的時候耍智障把判斷式寫成 >= 然後我就吃 WA 了 我還跑去問如果有多組解怎麼辦 結果超過一半的數字只會有一個QQ 還有把 NO 打成 No 就多吃兩個 penalty 了,虧爆 抓到,澪人桐不會寫程式
code
// by. MiohitoKiri5474
#include<bits/stdc++.h>
using namespace std;
map < int, int > lib;
int main(){
ios::sync_with_stdio ( false );
cin.tie ( 0 );
cout.tie ( 0 );
string str;
int in, cnt;
bool ans;
while ( getline ( cin, str ) ){
lib.clear();
cnt = 0;
ans = false;
stringstream ss ( str );
while ( ss >> in ){
lib[in]++;
cnt++;
}
for ( auto i: lib ){
if ( i.S > cnt / 2 ){
cout << i.F << '\n';
ans = true;
break;
}
}
if ( !ans )
cout << "NO\n";
}
}
problem 2
題目
給一個簡單的一元一次方程式 保證只有兩個數字、一個未知數 、一個等號、一個加減乘除 並保證所有運算元與運算子之間只都有空白隔開 並且求出 ,無條件捨去到小數點第一位
解法
要寫字串判斷很麻煩欸 = = pA寫爆了先來寫這題(? 手速不知道為什麼爆快 快到我自己也嚇到 也沒出什麼 bug,很快就 AC 了 <3
code
// by. MiohitoKiri5474
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
string str;
vector < int > lib;
int main(){
ios::sync_with_stdio ( false );
cin.tie ( 0 );
cout.tie ( 0 );
int opt, len, x, a, b, ans;
bool flag;
while ( getline ( cin, str ) ){
len = str.size(), x = 0, ans = 0;
flag = false;
lib.clear();
for ( int i = 0 ; i < len ; i++ ){
if ( str[i] == '+' )
opt = 0;
else if ( str[i] == '-' )
opt = 1;
else if ( str[i] == '*' )
opt = 2;
else if ( str[i] == '/' )
opt = 3;
else{
if ( '0' <= str[i] && str[i] <= '9' ){
x = x * 10 + int ( str[i] - '0' );
flag = true;
}
else{
if ( flag )
lib.pb ( x );
x = 0, flag = false;
}
}
}
if ( flag )
lib.pb ( x );
a = lib[0], b = lib[1];
if ( !opt )
ans = ( b - a ) * 10.0;
else if ( opt == 1 )
ans = ( b + a ) * 10.0;
else if ( opt == 2 )
ans = ( int ) ( ( double ) b / a * 10.0 );
else{
if ( str[0] == 'x' )
ans = ( int ) ( ( double ) b * a * 10.0 );
else
ans = ( int ) ( ( double ) a / b * 10.0 );
}
cout << ans / 10 << '.' << ans % 10 << '\n';
}
}
problem 3
題目
給定 組字串,請將字串以 切割 並輸出出所有字串
解法
啊就水題水到爆啊,多開個 string 紀錄就好了 這題沒有難度(蓋章
code
// by. MiohitoKiri5474
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio ( false );
cin.tie ( 0 );
cout.tie ( 0 );
string str, swp;
int t;
cin >> t;
getline ( cin, str );
while ( t-- ){
getline ( cin, str );
cout << "Tokens found:\n";
swp = "";
for ( auto i: str ){
if ( i == ':' || i == ',' || i == ';' ){
cout << swp << '\n';
swp = "";
}
else
swp += i;
}
if ( swp != "" )
cout << swp << '\n';
}
}
problem 4
題目
zj 上面的是羅馬數字轉阿拉伯數字 這次 ITSA 出的是要把阿拉伯數字轉羅馬數字 更水 = =
解法
直接按照位數打表輸出就好 。。。雖然這麼說,但是我還是出 bug 了 我把4打成”IIII”,正確應該是”IX” 垃圾是我QQ
code
// by.MiohitoKiri5474
#include<bits/stdc++.h>
using namespace std;
string lib0[10] = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" };
string lib1[10] = { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" };
string lib2[10] = { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" };
int main(){
ios::sync_with_stdio ( false );
cin.tie ( 0 );
cout.tie ( 0 );
int t, in;
cin >> t;
while ( t-- ){
cin >> in;
cout << lib2[in / 100] << lib1[in % 100 / 10] << lib0[in % 10] << '\n';
}
}
problem 5
題目
給定兩個字串,求出這兩個字串所有的 LCS
解法
本來只有丟任意解的 LCS 然後就吃 WA 了,又多一個 penalty 問官方官方一直沒有回應 就想說先寫所有解的版本好了 等到一回覆馬上 judge
然後這就是裸的 LCS 啊 = =
code
// by. MiohitoKiri5474
#include<bits/stdc++.h>
using namespace std;
int dp[105][105], ma;
int main(){
ios::sync_with_stdio ( false );
cin.tie ( 0 );
cout.tie ( 0 );
string a, b, str;
set < string > lib;
while ( cin >> a >> b ){
int szA = a.size(), szB = b.size();
lib.clear();
memset ( dp, 0, sizeof dp );
ma = 0;
for ( int i = 0 ; i < szA ; i++ ){
for ( int j = 0 ; j < szB ; j++ ){
if ( a[i] == b[j] ){
dp[i + 1][j + 1] = dp[i][j] + 1;
ma = max ( ma, dp[i + 1][j + 1] );
}
}
}
if ( !ma ){
cout << "No common sequence!\n";
continue;
}
for ( int i = 0 ; i < szA ; i++ ){
for ( int j = 0 ; j < szB ; j++ ){
if ( dp[i + 1][j + 1] == ma ){
str = "";
for ( int k = i - ma + 1 ; k <= i ; k++ )
str += a[k];
lib.insert ( str );
}
}
}
for ( auto i: lib )
cout << i << '\n';
}
}
後記
在第 37 分鐘的時候就破台了 (那時候師大還沒有破台) 那時候我跟師大的 penalty 差 67 也就是說如果師大 p4 吃超過67的 penalty 我就保證第一了 。。。然後師大只吃 66 80 抽抽不到術師匠的非洲酋長正常發揮QQ
下一次沒意外就會去打 PTC 了 不過是英文題目 我覺得我會扛不起來 在此誠徵英文好的選手一名 工作:只要幫我翻譯題目就好
然後這一篇的題解我居然寫了 330 行 喔,這行就 331 了 = = 雖然看起來很多不過大部分都是 code 就是了