#include <iostream>
#include <cmath>
using namespace std;
struct Point
{
int x,y;
};
double distance(Point a,Point b)
{
return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
}
int main()
{
int n,m,a,b;
cin>>n>>m;
Point p[1001],ask;
for(int i=0;i<n;i++)
cin>>p[i].x>>p[i].y;
while(m--)
{
cin>>ask.x>>ask.y;
double dist=distance(p[0],ask);
int flag=0;
for(int i=0;i<n;i++)
{
if(dist>distance(p[i],ask))
{
flag=i;
dist=distance(p[i],ask);
}
}
cout<<flag+1<<endl;
}
}
2020年8月25日 星期二
b976: 5.最終任務->a.尋找提示
程式碼:
b978: 7.最終任務->c.重組提示
程式碼:
#include <iostream>
using namespace std;
int main()
{
string s,ss;
int command;
while(cin>>s)
{
ss=s;
for(int i=0;i<s.size();i++)
{
cin>>command;
ss[command-1]=s[i];
}
cout<<ss<<endl;
}
}
c508: 去蟲
解題心得:
map反過來輸入的寫法:
for(map<int,int>::reverse_iterator rit=m.begin();rit!=m.rend();rit++)
cout<<rit->first<<endl;
程式碼:
map反過來輸入的寫法:
for(map<int,int>::reverse_iterator rit=m.begin();rit!=m.rend();rit++)
cout<<rit->first<<endl;
程式碼:
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
int n,arr[100001];
map<int,int> m;
map<int,int>::reverse_iterator it;
cin>>n;
for(int i=0;i<n;i++)
cin>>arr[i];
for(int i=0;i<n;i++)
m[arr[i]]++;
sort(arr,arr+n);
for(int i=0;i<n;i++)
cout<<arr[i]<<" ";
cout<<endl;
for(it=m.rbegin();it!=m.rend();it++)
cout<<it->first<<" ";
}
2020年8月24日 星期一
10905 - Children's Game
程式碼:
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(string a,string b)
{
return (a+b)>(b+a);
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
string l[51];
for(int i=0;i<n;i++)
cin>>l[i];
sort(l,l+n,cmp);
for(int i=0;i<n;i++)
cout<<l[i];
cout<<endl;
}
return 0;
}
d550: 物件排序
解題心得:
可以用內建sort,但要稍微優化IO。
vector二維初始化方式。
程式碼:
可以用內建sort,但要稍微優化IO。
vector二維初始化方式。
程式碼:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int n,m,tmp;
while(cin>>n>>m)
{
vector<vector<int>> l;
for(int i=0;i<n;i++)
{
vector<int> ll;
for(int j=0;j<m;j++)
{
cin>>tmp;
ll.push_back(tmp);
}
l.push_back(ll);
}
sort(l.begin(),l.end());
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<l[i][j]<<" ";
cout<<'\n';
}
}
return 0;
}
2020年8月23日 星期日
b265: Q11286 - Conformity
程式碼:
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int n,tmp,index[5];
while(cin>>n)
{
if(n==0) break;
map<string,int> m;
map<string,int>::iterator it;
while(n--)
{
string temp;
for(int i=0;i<5;i++)
cin>>index[i];
sort(index,index+5);
for(int i=0;i<5;i++)
temp+=to_string(index[i]);
it=m.find(temp);
if(it!=m.end()) (it->second)++;
else m[temp]=1;
}
int max=0,ans=0;
for(it=m.begin();it!=m.end();it++)
if(it->second>max) max=it->second;
for(it=m.begin();it!=m.end();it++)
if(it->second==max) ans+=max;
cout<<ans<<'\n';
}
return 0;
}
d517: 文字抄寫 I
程式碼:
#include <iostream>
#include <map>
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int n;
string temp;
while(cin>>n)
{
int len=1;
map<string,int> m;
map<string,int>::iterator it;
while(n--)
{
cin>>temp;
it=m.find(temp);
if(it!=m.end())
cout<<"Old! "<<it->second<<'\n';
else
{
cout<<"New! "<<len<<'\n';
m[temp]=len++;
}
}
}
return 0;
}
2020年8月20日 星期四
d502: 第三題:產品包裝
解題心得:
邊長=4的每個自己一箱,沒有剩餘空間。
邊長=3的每個自己一箱,每個剩下4*4*4-3*3*3 = 37 的空間
邊長=2的一箱可裝8個,若無法裝滿則剩下64-8*(b%8) 的空間
邊長=1的則是見縫插針,如果上面剩的空間夠就不用多一箱,不夠就多一箱。
程式碼:
邊長=4的每個自己一箱,沒有剩餘空間。
邊長=3的每個自己一箱,每個剩下4*4*4-3*3*3 = 37 的空間
邊長=2的一箱可裝8個,若無法裝滿則剩下64-8*(b%8) 的空間
邊長=1的則是見縫插針,如果上面剩的空間夠就不用多一箱,不夠就多一箱。
程式碼:
#include <iostream>
using namespace std;
int main()
{
int a,b,c,d;
while(cin>>a>>b>>c>>d)
{
int ans=0,space=0;
ans+=d;
ans+=c;
space+=37*c;
ans+=(b%8==0?b/8:b/8+1);
space+=64-8*(b%8);
if(a>space) ans++;
cout<<ans<<endl;
}
return 0;
}
c776: 106北二1.六邊形屋瓦
解題心得:
國高中數學題變形。
先觀察n=1時,a1=6, d=4
而n每增加1,a1就增加5,因此a1 = 6+(n-1)*5 = 5n+1
至於公差d,則是每次增加3,因此d = 4+(n-1)*3 = 3*n+1
所求由等比公式得知為: a1+(m-1)*d = (5n+1)+(m-1)(3n+1)
程式碼:
國高中數學題變形。
先觀察n=1時,a1=6, d=4
而n每增加1,a1就增加5,因此a1 = 6+(n-1)*5 = 5n+1
至於公差d,則是每次增加3,因此d = 4+(n-1)*3 = 3*n+1
所求由等比公式得知為: a1+(m-1)*d = (5n+1)+(m-1)(3n+1)
程式碼:
#include <iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
cout<<(5*n+1)+(m-1)*(3*n+1)<<endl;
return 0;
}
2020年8月18日 星期二
operator overloading
自定義物件的加減乘除等操作。
operator+
例如:
const Complex operator+(const Complex &obj); //member function
使用const+參考是為了效率。
還可以寫成friend function:
friend Comples operator+(Complex &o1,Complex &o2);
記得在外部定義即可:
Complex operator+(Complex &o1,Complex &o2)
{
return Complex(o1.real+o2.real,o1.imag+o2.imag); // 回傳沒有名字的物件
}
(note:
由上面的例子可得知,constructor本身並非void function,它會回傳沒有名字的物件。)
上面討論的都是 c3=c1+c2,也就是兩個參數都是object的時候。
如果是c3=c1+x呢?(x為任意int)
Complex Complex::operator+(int& x); //裡面傳的參數資料型態改一下
如果是c3=x+c2呢?
原本上面兩個狀況都是由c1這個物件呼叫operator+這個函式,有點像c1.operator+(c2)的感覺,所以才用member function。
現在則沒有物件能呼叫了,所以才用外部定義的friend function。
Complex operator+(int& x,Complex& o);
(note:
c3=(c1+c2) // c3 和 (c1+c2) 是不同物件。(c1+c2)是一個沒有名字的物件,它的值會被拿去給c3)
operator++
有prefix跟postfix兩種,為了區別於是寫法如下,只差在有沒有再傳參數進去。
Point& operator++() // prefix
{
count++;
return *this;
}
(note: 回傳值為參考)
Point operator++(int n) // postfix
{
Point tmp=*this;
this->count++;
return tmp;
}
(note: postfix 的 operator++回傳值不是參考!!否則會出現錯誤訊息:"warning: reference to local variable ‘result’ returned [-Wreturn-local-addr] ",因為若回傳tmp參考,tmp本身會再動作結束後消失造成錯誤!!)
可以簡化來看:
參考:overloading postfix and prefix operators
(the function overloading can be achieved by different data type and different number of argument list, but it cannot be different return type.)
operator>> & <<
friend istream& operator>>(istream& in,Complex &c)
{
in>>c.real>>c.imag;
return in;
}
friend ostream& operator<<(ostream& out,Complex &c)
{
out<<c.real<<" "<<c.imag<<endl;
return out;
}
(note:return in跟return out是為了連續輸入/輸出)
operator+
例如:
const Complex operator+(const Complex &obj); //member function
使用const+參考是為了效率。
還可以寫成friend function:
friend Comples operator+(Complex &o1,Complex &o2);
記得在外部定義即可:
Complex operator+(Complex &o1,Complex &o2)
{
return Complex(o1.real+o2.real,o1.imag+o2.imag); // 回傳沒有名字的物件
}
(note:
由上面的例子可得知,constructor本身並非void function,它會回傳沒有名字的物件。)
上面討論的都是 c3=c1+c2,也就是兩個參數都是object的時候。
如果是c3=c1+x呢?(x為任意int)
Complex Complex::operator+(int& x); //裡面傳的參數資料型態改一下
如果是c3=x+c2呢?
原本上面兩個狀況都是由c1這個物件呼叫operator+這個函式,有點像c1.operator+(c2)的感覺,所以才用member function。
現在則沒有物件能呼叫了,所以才用外部定義的friend function。
Complex operator+(int& x,Complex& o);
(note:
c3=(c1+c2) // c3 和 (c1+c2) 是不同物件。(c1+c2)是一個沒有名字的物件,它的值會被拿去給c3)
operator++
有prefix跟postfix兩種,為了區別於是寫法如下,只差在有沒有再傳參數進去。
Point& operator++() // prefix
{
count++;
return *this;
}
(note: 回傳值為參考)
Point operator++(int n) // postfix
{
Point tmp=*this;
this->count++;
return tmp;
}
(note: postfix 的 operator++回傳值不是參考!!否則會出現錯誤訊息:"warning: reference to local variable ‘result’ returned [-Wreturn-local-addr] ",因為若回傳tmp參考,tmp本身會再動作結束後消失造成錯誤!!)
可以簡化來看:
operator++()
operator++(int)
值得注意的是為何postfix operator需要額外的傳int進去呢?這是因為C++判斷function的時候,是由它們的signature,也就是參數數量、型別與順序,而非回傳值來看。參考:overloading postfix and prefix operators
(the function overloading can be achieved by different data type and different number of argument list, but it cannot be different return type.)
operator>> & <<
friend istream& operator>>(istream& in,Complex &c)
{
in>>c.real>>c.imag;
return in;
}
friend ostream& operator<<(ostream& out,Complex &c)
{
out<<c.real<<" "<<c.imag<<endl;
return out;
}
(note:return in跟return out是為了連續輸入/輸出)
2020年8月16日 星期日
a870: 10. List Maker
解題心得:
vector find: find(vec.begin(),vec.end(),x);
vector insert: vec.insert(it,x); // or vec.insert(vec.begin()+n,x);
vector erase: vec.erase(it) // or vec.erase(vec.begin()+n);
程式碼:
vector find: find(vec.begin(),vec.end(),x);
vector insert: vec.insert(it,x); // or vec.insert(vec.begin()+n,x);
vector erase: vec.erase(it) // or vec.erase(vec.begin()+n);
程式碼:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
string command,x,n;
vector<string> l;
while(cin>>command)
{
if(command=="SHOW") break;
if(command=="ADD")
{
cin>>x;
l.push_back(x);
}
else if(command=="INSERT")
{
cin>>x>>n;
vector<string>::iterator it=find(l.begin(),l.end(),n);
l.insert(it,x);
}
else if(command=="REMOVE")
{
cin>>x;
for(int i=0;i<l.size();i++)
{
if(l[i]==x)
{
l.erase(l.begin()+i);
break;
}
}
}
}
for(int i=0;i<l.size();i++)
cout<<l[i]<<" ";
return 0;
}
a787: 9. Mirror to the Stars
程式碼:
#include <iostream>
using namespace std;
int main()
{
string name,command;
int width,height;
char picture[37][25];
while(cin>>name>>width>>height>>command)
{
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
cin>>picture[i][j];
cout<<name<<endl;
for(int l=0;l<command.size();l++)
{
char copy[37][25];
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
copy[i][j]=picture[i][j];
if(command[l]=='R')
{
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
picture[i][j]=copy[i][width-1-j];
}
else
{
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
picture[i][j]=copy[height-1-i][j];
}
}
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
cout<<picture[i][j];
cout<<endl;
}
}
return 0;
}
2020年8月14日 星期五
12918 - Lucky Thief
程式碼:
#include <iostream>
using namespace std;
int main()
{
int t,n,m;
cin>>t;
while(t--)
{
cin>>n>>m;
long long int up=m-1,down=m-n;
cout<<(up+down)*n/2<<endl;
}
return 0;
}
11498 - Division of Nlogonia
程式碼:
#include <iostream>
using namespace std;
int main()
{
int k,n,m,x,y;
while(cin>>k)
{
if(k==0) break;
cin>>n>>m;
for(int i=0;i<k;i++)
{
cin>>x>>y;
if(x==n||y==m) cout<<"divisa"<<endl;
else if(x>n&&y>m) cout<<"NE"<<endl;
else if(x>n&&y<m) cout<<"SE"<<endl;
else if(x<n&&y>m) cout<<"NO"<<endl;
else cout<<"SO"<<endl;
}
}
return 0;
}
263 - Number Chains
程式碼:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
string s;
while(cin>>s)
{
if(s=="0") break;
cout<<"Original number was "<<s<<endl;
string bigToSmall=s,smallToBig=s;
int chain=0;
vector<string> list;
while(1)
{
chain++;
bigToSmall=s,smallToBig=s;
for(int i=0;i<bigToSmall.size();i++)
{
for(int j=0;j<bigToSmall.size();j++)
{
if(bigToSmall[i]>bigToSmall[j]) swap(bigToSmall[i],bigToSmall[j]);
if(smallToBig[i]<smallToBig[j]) swap(smallToBig[i],smallToBig[j]);
}
}
int big=stoi(bigToSmall),small=stoi(smallToBig),repeat=0;
s=to_string(big-small);
cout<<big<<" - "<<small<<" = "<<s<<endl;
for(int i=0;i<list.size();i++)
{
if(s==list[i])
{
repeat=1;
break;
}
}
if(repeat) break;
list.push_back(s);
}
cout<<"Chain length "<<chain<<endl<<endl;
}
return 0;
}
friend
若某個函式是某class的friend,那個函式就可以存取到private的資料。
它會被宣告在class外面,就像一般的函式一樣。不過在class裡面會多加一個friend在前面。
寫在private或public部分沒有影響,畢竟它不是member function,只是friend。
class CPoint
{
private:
int x,y;
friend CPoint offset(CPoint &pt,int diff);
public:
CPoint(){x=0,y=0;}
CPoint(int a,int b){x=a,y=b;}
void Print(){cout<<x<<" "<<y<<endl;}
};
CPoint offset(CPoint &pt,int diff)
{
pt.x+=diff;pt.y+=diff;
return pt;
}
int main()
{
CPoint p1(3,4);
p1.Print();
offset(p1,10);
p1.Print();
return 0;
}
friend除了用在function上,還能用在class。
如果:
class A
{
friend class B;
// other code....
};
那class B裡的所有member function都能取用class A的private資料。
但friend的關係並非雙向!
它會被宣告在class外面,就像一般的函式一樣。不過在class裡面會多加一個friend在前面。
寫在private或public部分沒有影響,畢竟它不是member function,只是friend。
class CPoint
{
private:
int x,y;
friend CPoint offset(CPoint &pt,int diff);
public:
CPoint(){x=0,y=0;}
CPoint(int a,int b){x=a,y=b;}
void Print(){cout<<x<<" "<<y<<endl;}
};
CPoint offset(CPoint &pt,int diff)
{
pt.x+=diff;pt.y+=diff;
return pt;
}
int main()
{
CPoint p1(3,4);
p1.Print();
offset(p1,10);
p1.Print();
return 0;
}
friend除了用在function上,還能用在class。
如果:
class A
{
friend class B;
// other code....
};
那class B裡的所有member function都能取用class A的private資料。
但friend的關係並非雙向!
2020年8月13日 星期四
【Hamilton】The World Was Wide Enough 歌詞筆記
sign on:擔任
number two:副手
terrain:地形
marksman:神槍手
rigor:嚴格的
methodically:有條不紊的
fiddle:撥弄
seconds:副手
send in:派出
set the record straight:澄清是非
take aim:瞄準
wise up:領悟
usher:迎來
wailing:哀號、哭泣
obliterate:抹去不留痕跡
number two:副手
terrain:地形
marksman:神槍手
rigor:嚴格的
methodically:有條不紊的
fiddle:撥弄
seconds:副手
send in:派出
set the record straight:澄清是非
take aim:瞄準
wise up:領悟
usher:迎來
wailing:哀號、哭泣
obliterate:抹去不留痕跡
10093 - An Easy Problem!
解題心得:
解題推導參考網路。
程式碼:
解題推導參考網路。
程式碼:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
while(getline(cin,s))
{
int sum=0,temp,max=1;
for(int i=0;i<s.size();i++)
{
if('0'<=s[i]&&s[i]<='9') temp=s[i]-'0';
else if('A'<=s[i]&&s[i]<='Z') temp=s[i]-'A'+10;
else if('a'<=s[i]&&s[i]<='z') temp=s[i]-'a'+36;
else continue;
if(temp>max) max=temp;
sum+=temp;
}
for(int i=max;i<=62;i++)
{
if(sum%i==0)
{
cout<<(i+1)<<endl;
break;
}
else if(i==62) cout<<"such number is impossible!"<<endl;
}
}
return 0;
}
const member function && const static function
class 的 object 也能像 int, double 等資料型態一樣,被宣告成 const,這代表該object的資料不能被任意更動。
因此只有不會更動到資料的函式,也就是const member function能被這種const object呼叫。
宣告const member function的語法就是在()與{}間加上const:
class ID{
private:
string name;
public:
ID(string n){name=n;}
string getName() const {return name;}
};
這樣一來,如果要在getName()這個函式修改值,像是把name="unknown"的話,就會出現編譯錯誤的訊息。
另外,由於const object不能使用一般的 member function,但 const object 跟 non-const object 都能使用 const member function,在寫某些不會更動值的函式像是accessor時,可以直接加個const。
參考:
https://www.geeksforgeeks.org/const-member-functions-c/
因此只有不會更動到資料的函式,也就是const member function能被這種const object呼叫。
宣告const member function的語法就是在()與{}間加上const:
class ID{
private:
string name;
public:
ID(string n){name=n;}
string getName() const {return name;}
};
這樣一來,如果要在getName()這個函式修改值,像是把name="unknown"的話,就會出現編譯錯誤的訊息。
另外,由於const object不能使用一般的 member function,但 const object 跟 non-const object 都能使用 const member function,在寫某些不會更動值的函式像是accessor時,可以直接加個const。
參考:
https://www.geeksforgeeks.org/const-member-functions-c/
_______________________
static 通常不會單獨出現,而是配合著 const 。
宣告也是在外面,不過是 const + data type 一起。
class CScore {
protected:
//declare a static constant
static const int Max;
};
const int CScore::Max = 100; //outside class
2020年8月12日 星期三
static data members & static function
class X {
private:
static int count;
};
int X::count = 0;
static 的資料屬於所有 class object共享,就好像 class 裡的 member function一樣。又因為在定義 class 時還沒有對資料賦值,因此初始化要寫在 class 的定義外面。
class CNum {
public:
CNum(int a) { x = a; y += x; }
static void fun(CNum m) {
cout << m.x << "vs." << y << endl; }
private:
int x;
static int y;
};
int CNum::y = 0;
int main()
{
CNum O1(4), O2(7);
CNum::fun(O1);
CNum::fun(O2);
}
既然所有的object都共享同一份static 變數,要怎麼存取它呢?
可以用static的member function來存取它,如上面code。
在同一個 class 裡的member function其實本來就是共享的,加上static是為了處理 static 的資料。
private:
static int count;
};
int X::count = 0;
static 的資料屬於所有 class object共享,就好像 class 裡的 member function一樣。又因為在定義 class 時還沒有對資料賦值,因此初始化要寫在 class 的定義外面。
class CNum {
public:
CNum(int a) { x = a; y += x; }
static void fun(CNum m) {
cout << m.x << "vs." << y << endl; }
private:
int x;
static int y;
};
int CNum::y = 0;
int main()
{
CNum O1(4), O2(7);
CNum::fun(O1);
CNum::fun(O2);
}
既然所有的object都共享同一份static 變數,要怎麼存取它呢?
可以用static的member function來存取它,如上面code。
在同一個 class 裡的member function其實本來就是共享的,加上static是為了處理 static 的資料。
12019 - Doom's Day Algorithm
程式碼:
#include <iostream>
using namespace std;
int main()
{
int cases,index[12]={31,28,31,30,31,30,31,31,30,31,30,31};
string week[7]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};
cin>>cases;
while(cases--)
{
int m,d,total=0;
cin>>m>>d;
for(int i=0;i<m-1;i++)
total+=index[i];
total+=d;
cout<<week[(total-1)%7]<<endl;
}
}
11349 - Symmetric Matrix
程式碼:
#include <iostream>
using namespace std;
int main()
{
char ignore;
int t;
cin>>t;
for(int rounds=1;rounds<=t;rounds++)
{
cout<<"Test #"<<rounds<<": ";
int n,flag=0;
long long int matrix[101][101];
cin>>ignore>>ignore>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>matrix[i][j];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(matrix[i][j]!=matrix[n-1-i][n-1-j]||matrix[i][j]<0)
flag=1;
}
}
if(flag) cout<<"Non-symmetric."<<endl;
else cout<<"Symmetric."<<endl;
}
}
2020年8月11日 星期二
11321 - Sort! Sort!! and Sort!!!
解題心得:
1.使用內建sort()
2.負數mod出來也會是負數
3.比較時有四種狀況:不同餘、同餘皆奇、同餘皆偶、同餘一奇一偶
程式碼:
1.使用內建sort()
2.負數mod出來也會是負數
3.比較時有四種狀況:不同餘、同餘皆奇、同餘皆偶、同餘一奇一偶
程式碼:
#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
bool cmp(int a,int b)
{
if(a%m!=b%m) return a%m<b%m;
if(abs(a%2)==1&&abs(b%2)==1) return a>b;
if(abs(a%2)==0&&abs(b%2)==0) return a<b;
return abs(a%2);
}
int main()
{
int l[10001];
while(cin>>n>>m)
{
cout<<n<<" "<<m<<endl;
if(n==0&&m==0) break;
for(int i=0;i<n;i++)
cin>>l[i];
sort(l,l+n,cmp);
for(int i=0;i<n;i++)
cout<<l[i]<<endl;
}
return 0;
}
function pointer
#include <iostream>
using namespace std;
double f()
{
return 8.7;
}
int main()
{
double (*pF)();
pF=f; // or pF=&f
double result=(*pF)();
cout<<result<<endl;
return 0;
}
執行結果:8.7
2020年8月10日 星期一
# 讀報 What Footage of the Beirut Explosion Tells Us About the Blast
https://www.nytimes.com/2020/08/05/video/beirut-explosion-footage.html
a plume of smoke:羽狀煙霧
displace:迫使...離開常居地
rip through:快速猛烈的穿透地方或建築物
envelop:環繞、包圍
confiscate from:沒收、充公
stockpile:儲存
welding:焊接
military grade:軍用級
silo:穀倉
gaping:(洞或開口)大的
Container Terminal:貨櫃中心
capsize:覆沒
detonation:引爆
mosque:清真寺
a plume of smoke:羽狀煙霧
displace:迫使...離開常居地
rip through:快速猛烈的穿透地方或建築物
envelop:環繞、包圍
confiscate from:沒收、充公
stockpile:儲存
welding:焊接
military grade:軍用級
silo:穀倉
gaping:(洞或開口)大的
Container Terminal:貨櫃中心
capsize:覆沒
detonation:引爆
mosque:清真寺
118 - Mutant Flatworld Explorers
解題心得:
用陣列紀錄如果超出範圍的前一個座標,如果那個座標曾被標記過,代表這次可以忽略。
程式碼:
用陣列紀錄如果超出範圍的前一個座標,如果那個座標曾被標記過,代表這次可以忽略。
程式碼:
#include <iostream>
using namespace std;
int main()
{
int w,h,x,y,map[51][51]={0};
char direction;
cin>>w>>h;
while(cin>>x>>y>>direction)
{
int lost=0;
string command;
cin>>command;
for(int i=0;i<command.size();i++)
{
if(command[i]=='L')
{
switch(direction)
{
case 'N':
direction='W';break;
case 'E':
direction='N';break;
case 'S':
direction='E';break;
case 'W':
direction='S';break;
}
}
else if(command[i]=='R')
{
switch(direction)
{
case 'N':
direction='E';break;
case 'E':
direction='S';break;
case 'S':
direction='W';break;
case 'W':
direction='N';break;
}
}
else if(command[i]=='F')
{
int nextX=x,nextY=y;
if(direction=='N') nextY++;
else if(direction=='E') nextX++;
else if(direction=='S') nextY--;
else if(direction=='W') nextX--;
if(nextX>w||nextX<0||nextY>h||nextY<0)
{
if(map[x][y]==1)
continue;
else
{
lost=1;
map[x][y]=1;
break;
}
}
x=nextX,y=nextY;
}
}
cout<<x<<" "<<y<<" "<<direction<<(lost?" LOST":"")<<endl;
}
return 0;
}
2020年8月8日 星期六
299 - Train Swapping
程式碼:
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int l,train[51],times=0;
cin>>l;
for(int i=0;i<l;i++)
cin>>train[i];
for(int i=0;i<l;i++)
{
for(int j=i;j<l;j++)
{
if(train[i]>train[j])
{
swap(train[i],train[j]);
times++;
}
}
}
cout<<"Optimal train swapping takes "<<times<<" swaps."<<endl;
}
return 0;
}
2020年8月7日 星期五
10409 - Die Game
解題心得:
可以自己手做一個小骰子模擬。
程式碼:
可以自己手做一個小骰子模擬。
程式碼:
#include <iostream>
using namespace std;
int main()
{
int num;
while(cin>>num)
{
if(num==0) break;
int top=1,n=2,w=3,bottom=7-top,s=7-n,e=7-w;
while(num--)
{
string str;
cin>>str;
if(str=="north")
{
int temp=n;
n=top;
top=s;
s=bottom;
bottom=temp;
}
else if(str=="south")
{
int temp=s;
s=top;
top=n;
n=bottom;
bottom=temp;
}
else if(str=="east")
{
int temp=e;
e=top;
top=w;
w=bottom;
bottom=temp;
}
else if(str=="west")
{
int temp=w;
w=top;
top=e;
e=bottom;
bottom=temp;
}
}
cout<<top<<endl;
}
return 0;
}
10193 - All You Need Is Love
解題心得:
1.二進位轉十進位(& string to int)
2.gcd
程式碼:
1.二進位轉十進位(& string to int)
2.gcd
程式碼:
#include <iostream>
#include <string>
using namespace std;
int to_dec(string s)
{
int expo=1,sum=0;
for(int i=s.size()-1;i>=0;i--)
{
sum+=(s[i]-'0')*expo;
expo*=2;
}
return sum;
}
int gcd(int a,int b)
{
while((a%=b)!=0&&(b%=a)!=0);
return a+b;
}
int main()
{
int n;
cin>>n;
for(int cases=1;cases<=n;cases++)
{
string s1,s2;
int n1,n2;
cin>>s1>>s2;
n1=to_dec(s1),n2=to_dec(s2);
cout<<"Pair #"<<cases<<": ";
if(gcd(n1,n2)!=1) cout<<"All you need is love!"<<endl;
else cout<<"Love is not all you need!"<<endl;
}
return 0;
}
2020年8月6日 星期四
copy constructor & copy assignment constructor & default constructor
copy constructor
A::A(const A& a)
{
// code
}
使用時機:有指標的時候
使用方法:
A a;
a.setValue(.....); // 初始化a
A b(a);
注意:跟Copy Assignment Operator不一樣!!
copy constructor是一種constructor,顧名思義是在初始化的時候用的。而copy assignment operator則是跟 = 有關。
copy assignment constructor
A& A::operator=(const A& a)
{
//code
return *this;
}
note:回傳參考!!
參考連結:
http://jyleef.blogspot.com/2012/04/copy-constructor.html
[C++筆記] 拷貝建構式(Copy Constructor) & 複製指派運算子(Copy Assignment Operator)
A::A(const A& a)
{
// code
}
使用時機:有指標的時候
使用方法:
A a;
a.setValue(.....); // 初始化a
A b(a);
注意:跟Copy Assignment Operator不一樣!!
copy constructor是一種constructor,顧名思義是在初始化的時候用的。而copy assignment operator則是跟 = 有關。
copy assignment constructor
A& A::operator=(const A& a)
{
//code
return *this;
}
note:回傳參考!!
參考連結:
http://jyleef.blogspot.com/2012/04/copy-constructor.html
[C++筆記] 拷貝建構式(Copy Constructor) & 複製指派運算子(Copy Assignment Operator)
default constructor
如果沒有宣告constructor的話,會自動生成一個沒有任何參數的constructor,像這樣:
如果沒有宣告constructor的話,會自動生成一個沒有任何參數的constructor,像這樣:
A::A(){;}
但如果有宣告constructor的話,就不會自動生成。
但如果有宣告constructor的話,就不會自動生成。
11005 - Cheapest Base
程式碼:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int cases;
while(cin>>cases)
{
for(int rounds=1;rounds<=cases;rounds++)
{
cout<<"Case "<<rounds<<":"<<endl;
int index[36];
for(int i=0;i<36;i++)
cin>>index[i];
int num;
cin>>num;
while(num--)
{
int n,min_cost=1000000000,min_base=100;
cin>>n;
cout<<"Cheapest base(s) for number "<<n<<":";
for(int i=2;i<=36;i++)
{
int cost=0,number=n;
while(number>0)
{
cost+=index[number%i];
number/=i;
}
if(cost<min_cost) min_cost=cost,min_base=i;
}
for(int i=2;i<=36;i++)
{
int cost=0,number=n;
while(number>0)
{
cost+=index[number%i];
number/=i;
}
if(cost==min_cost) cout<<" "<<i;
}
cout<<endl;
}
if(rounds!=cases) cout<<endl;
}
}
return 0;
}
2020年8月5日 星期三
【Hamilton】Farmer Refuted 歌詞筆記
Refuted:駁斥
hear ye:官方發言前的開場詞,尤其在法庭上
heed:注意(警告或建議)
rabble:烏合之眾、暴民
at heart:在心裡
bloodshed:殺戮
astray:誤入歧途
unravel:破壞、拆散
have-nots:富人與窮人
straight face:故意板起的臉孔
thee:你
mange:癬
divisive:引起分歧的
indecisive:優柔寡斷的
niceties:美好、精美
hear ye:官方發言前的開場詞,尤其在法庭上
heed:注意(警告或建議)
rabble:烏合之眾、暴民
at heart:在心裡
bloodshed:殺戮
astray:誤入歧途
unravel:破壞、拆散
have-nots:富人與窮人
straight face:故意板起的臉孔
thee:你
mange:癬
divisive:引起分歧的
indecisive:優柔寡斷的
niceties:美好、精美
11063 - B2-Sequence
程式碼:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n,arr[101],times=1;
while(cin>>n)
{
int flag=1;
for(int i=0;i<n;i++)
cin>>arr[i];
for(int i=0;i<n-1;i++)
{
if(arr[i]>0&&arr[i]<arr[i+1]);
else flag=0;
}
vector<int> sq;
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
if(find(sq.begin(),sq.end(),arr[i]+arr[j])!=sq.end())
flag=0;
else
sq.push_back(arr[i]+arr[j]);
}
}
cout<<"Case #"<<times++<<": ";
if(flag==0) cout<<"It is not a B2-Sequence."<<endl;
else cout<<"It is a B2-Sequence."<<endl;
cout<<endl;
}
return 0;
}
10057 - A mid-summer night's dream.
解題心得:
好像是高中數學?
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,arr[1000001];
while(cin>>n)
{
int A,two=0,three=0;
for(int i=0;i<n;i++)
cin>>arr[i];
sort(arr,arr+n);
if(n%2) // odd
{
A=arr[n/2];
for(int i=0;i<n;i++)
{
if(arr[i]==A) two++;
}
three=1;
}
else // even
{
A=arr[n/2-1];
for(int i=0;i<n;i++)
{
if(arr[i]==arr[n/2]||arr[i]==arr[n/2-1])
two++;
}
three=arr[n/2]-arr[n/2-1]+1;
}
cout<<A<<" "<<two<<" "<<three<<endl;
}
return 0;
}
2020年8月4日 星期二
948 - Fibonaccimal Base
程式碼:
#include <iostream>
using namespace std;
int main()
{
int f[40],n,num;
f[0]=f[1]=1;
for(int i=2;i<40;i++)
f[i]=f[i-1]+f[i-2];
cin>>n;
while(n--)
{
int start=0;
cin>>num;
cout<<num<<" = ";
for(int i=39;i>=1;i--)
{
if(num/f[i]) cout<<"1",start=1;
else if(start) cout<<"0";
num%=f[i];
}
cout<<" (fib)"<<endl;
}
return 0;
}
10189 - Minesweeper
解題心得:
注意最後一筆測資後不需換行。
程式碼:
注意最後一筆測資後不需換行。
程式碼:
[解一]
#include <iostream>
using namespace std;
int main()
{
int n,m,times=1;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
if(times!=1) cout<<endl;
char map[105][105];
for(int i=0;i<100;i++)
for(int j=0;j<100;j++)
map[i][j]='0';
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>map[i][j];
cout<<"Field #"<<times++<<":"<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(map[i][j]=='*') cout<<map[i][j];
else
{
int count=0;
for(int x=i-1;x<=i+1;x++)
{
for(int y=j-1;y<=j+1;y++)
{
if(map[x][y]=='*') count++;
}
}
cout<<count;
}
}
cout<<endl;
}
}
return 0;
}
[解二]
#include <iostream>
using namespace std;
int main()
{
int n, m, counter = 1;
int dx[8] = { -1,-1,-1,0,0,1,1,1 }, dy[8] = { -1,0,1,-1,1,-1,0,1 };
while (cin >> n >> m && n && m)
{
if (counter != 1) cout << endl;
char arr[101][101];
for (int i = 0; i < 101; i++)
for (int j = 0; j < 101; j++)
arr[i][j] = '0';
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> arr[i][j];
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (arr[i][j] != '*')
{
int total = 0;
for (int k = 0; k < 8; k++)
{
if (arr[i + dx[k]][j + dy[k]] == '*')
total++;
}
arr[i][j] = total + '0';
}
}
}
cout << "Field #" << counter++ << ":" << endl;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
cout << arr[i][j];
cout << endl;
}
}
return 0;
}
2020年8月3日 星期一
【Hamilton】Aaron Burr, Sir 歌詞筆記
I'm at your service:願為您效勞
sort of:有點
out of sorts:心情不佳
bursar:(學校、大學裡的)財務主管
dying wish:遺願
bargained for:預料(常與more than連用)
buy you a drink:請你喝一杯
run their mouths off:太多話
pint:品脫
Sam Adams:啤酒名
redcoats:英國軍人
chicka:語助詞
cop:警察
lock up:鎖好
corsets:束腹
brew:啤酒
prodigy:神童
verse:韻文
Good luck with that:phrase that people say when you're going to try something that they think will be hard or impossible.
imminent:即將來臨
sort of:有點
out of sorts:心情不佳
bursar:(學校、大學裡的)財務主管
dying wish:遺願
bargained for:預料(常與more than連用)
buy you a drink:請你喝一杯
run their mouths off:太多話
pint:品脫
Sam Adams:啤酒名
redcoats:英國軍人
chicka:語助詞
cop:警察
lock up:鎖好
corsets:束腹
brew:啤酒
prodigy:神童
verse:韻文
Good luck with that:phrase that people say when you're going to try something that they think will be hard or impossible.
imminent:即將來臨
d141: Linearity
解題心得:
看兩條線是否相等,就是列等式看一不一樣。
因為有除以零或者兩點相同的可能,所以把兩邊等式交叉相乘,直接看乘積是否相等。
程式碼:
看兩條線是否相等,就是列等式看一不一樣。
因為有除以零或者兩點相同的可能,所以把兩邊等式交叉相乘,直接看乘積是否相等。
程式碼:
#include<iostream>
using namespace std;
typedef struct
{
int x,y;
}Point;
int main()
{
int cases;
char ignore;
cin>>cases;
while(cases--)
{
Point p1,p2,p3;
cin>>p1.x>>ignore>>p1.y>>p2.x>>ignore>>p2.y>>p3.x>>ignore>>p3.y;
double m1,m2;
if((p2.y-p1.y)*(p3.x-p2.x)==(p2.x-p1.x)*(p3.y-p2.y))
cout<<"collinear"<<endl;
else cout<<"not collinear"<<endl;
}
return 0;
}
10268 - 498-bis
解題心得:
記得再寫一次這題。
程式碼:
記得再寫一次這題。
程式碼:
#include<iostream>
using namespace std;
int a[1000000];
int derivative(int x,int max)
{
long long sum=0,exp=1;
int i;
for(i=max-1;i>=0;i--)
{
sum+=a[i]*exp*(max-i);
exp*=x;
}
return sum;
}
int main()
{
int x,n;
while(cin>>x)
{
for(n=0;;n++)
{
cin>>a[n];
if(getchar()=='\n')
break;
}
cout<<derivative(x,n)<<endl;
}
return 0;
}
2020年8月2日 星期日
簡易翻牌遊戲
使用說明:
總共36格,內為A~R x2 隨機排列的表格。
索引從0開始,35結束。
依指示輸入想翻開的卡牌,若該次兩張牌相同,則成功找出;反之則蓋回去。
沒有防呆,不能輸入0~35外的數字、已被翻開的卡牌索引、每次不得輸入兩相同索引。
(也許還有其他錯誤?)
程式碼:
總共36格,內為A~R x2 隨機排列的表格。
索引從0開始,35結束。
依指示輸入想翻開的卡牌,若該次兩張牌相同,則成功找出;反之則蓋回去。
沒有防呆,不能輸入0~35外的數字、已被翻開的卡牌索引、每次不得輸入兩相同索引。
(也許還有其他錯誤?)
程式碼:
#include <iostream>
using namespace std;
int main()
{
srand(time(NULL));
int index[18]={0},counter=0;
char map[6][6]={'*'},alpha[6][6];
for(int i=0;i<6;i++)
for(int j=0;j<6;j++)
map[i][j]='*',alpha[i][j]='*';
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
int letter=rand()%18;
while(index[letter]>=2)
letter=rand()%18;
alpha[i][j]=char(letter+'A');
index[letter]++;
}
}
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
cout<<alpha[i][j]<<" ";
cout<<endl;
}
while(counter<36)
{
int cardIndex1,cardIndex2;
cout<<"Please enter card index: ";
cin>>cardIndex1;
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
if(cardIndex1/6==i&&cardIndex1%6==j)
cout<<alpha[i][j]<<" ";
else
cout<<map[i][j]<<" ";
}
cout<<endl;
}
cout<<"Please enter card index: ";
cin>>cardIndex2;
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
if(cardIndex1/6==i&&cardIndex1%6==j)
cout<<alpha[i][j]<<" ";
else if(cardIndex2/6==i&&cardIndex2%6==j)
cout<<alpha[i][j]<<" ";
else
cout<<map[i][j]<<" ";
}
cout<<endl;
}
if(alpha[cardIndex1/6][cardIndex1%6]==alpha[cardIndex2/6][cardIndex2%6])
{
cout<<"Good Job!"<<endl;
counter+=2;
map[cardIndex1/6][cardIndex1%6]=alpha[cardIndex1/6][cardIndex1%6];
map[cardIndex2/6][cardIndex2%6]=alpha[cardIndex2/6][cardIndex2%6];
}
else cout<<"Try Again!"<<endl;
}
cout<<"Congratulation!!"<<endl;
}
2020年8月1日 星期六
10908 - Largest Square
解題心得:
細節要注意。
程式碼:
細節要注意。
程式碼:
#include <iostream>
using namespace std;
int main()
{
int t,m,n,q,r,c;
cin>>t;
while(t--)
{
char map[100][100]={'0'};
cin>>m>>n>>q;
cout<<m<<" "<<n<<" "<<q<<endl;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>map[i][j];
while(q--)
{
cin>>r>>c;
int length=0,out=0;
char target=map[r][c];
while(1)
{
int i,j;
for(i=r-length;i<=r+length;i++)
{
for(j=c-length;j<=c+length;j++)
{
if(map[i][j]!=target)
{
out=1;
break;
}
else if(i<0||j<0||i>=m||j>=n)
{
out=1;
break;
}
}
if(out) break;
}
if(out)
{
length--;
break;
}
length++;
}
cout<<length*2+1<<endl;
}
}
return 0;
}
訂閱:
意見 (Atom)