A. Optimal Currency Exchange
就是汇率问题,不难发现,我们其实只要换
d
o
l
l
a
r
dollar
dollar或
e
u
r
o
euro
euro的最小面值即可,也就是1,和5,其他面值可以通过这两个比例得到,所以问题就简化了。
于是暴力即可
#include <iostream>
using namespace std;
int main()
{
int n; cin >> n;
int d,e; cin >> d >> e;
if(n%d==0 || n%(5*e)==0) n = 0;
else{
int temp = n;
for(int i = 0; i <= n/(5*e); ++i){
temp = min(temp,(n - i*5*e)%d);
}
n = temp;
}
cout << n << endl;
return 0;
}
B. Badges
题意:
有b个男生,g个女生,现在有n个人来了会场,有n+1种包,每一个包中 有 i个蓝色徽章(给男生的), n-i个红色徽章(给女生的)
考虑一下,可以发现,当现在的包中有一项大于b或者g的时候,就可能会出现问题,因为多出来的那些徽章没用,那么就可以得到另一种徽章需要的个数,如果此时不满足,那么这个包就不需要,反之需要(看代码)
#include <iostream>
using namespace std;
int main(){
int b,g,n; cin >> b >> g >> n;
int tot = 0;
for(int i = 0; i <= n; ++i){
if( ( (i > b) && (n-i < n - b)) || (( (n-i > g) && (i < n-g) ))) {
continue;
}
tot++;
}
cout << tot << endl;
return 0;
}
C. Bad Sequence
也就是个括号匹配,如果能匹配成功那么就消去这对括号,然后去判断剩余括号的个数和种类
因为题意中可以移动一个括号,那么也就是当括号个数==2时,并且是 )( 情况的时候成立(看代码把)
#include <iostream>
using namespace std;
char arr[20000000];
int main(){
int n; cin >> n;
int head = 0;
for(int i = 0; i < n; ++i){
char c; cin >> c;
if(!i) arr[head++] = c;
else{
if(c==')'){
if(arr[head-1]=='(') head--;
else arr[head++] = c;
}
else if(c=='('){
arr[head++] = c;
}
}
}
if(head==1 || head > 2){
cout << "No" << endl;
}
else if(head==2){
if(arr[0]==')' && arr[1] == '('){
cout << "Yes" << endl;
}
else cout << "No" << endl;
}
else cout << "Yes" << endl;
return 0;
}
D. Treasure Island
最少放多少个障碍物使得该图无法从
(
1
,
1
)
−
>
(
n
,
m
)
(1,1) ->(n,m)
(1,1)−>(n,m)
很容易直观想到堵住入口或出口(ans<=2),然后再跑两遍dfs,去确定是不是只有一条路可以走或者无路可走
然后取最小值就可以了,至于建图问题,只需要记录那些障碍物的
(
x
,
y
)
(x,y)
(x,y)即可,用set保存。
#include <iostream>
#include <set>
using namespace std;
const int maxn = 1e6;
set<pair<int,int>>st; // 存那些走不了的点
long long ans;
int n,m;
bool isfind = false;
void dfs(int x,int y){
if(x < 1 || x > n || y < 1 || y > m)
return;
if(x==n&&y==m){
ans++;
isfind = true;
return;
}
if(isfind) return;
if(st.count(make_pair(x,y))) return;
if(x!=1 || y!=1)
st.insert(make_pair(x,y));
dfs(x+1,y);
dfs(x,y+1);
}
int main()
{
cin >> n >> m;
bool gg[4] = {false,false,false,false};
getchar();
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= m; ++j){
char c = getchar();
if(c=='#'){
st.insert(make_pair(i,j));
if(i==2 && j==1){ // 看左上角和右下角
gg[0] = 1;
}
else if(i==1 && j==2){
gg[1] = 1;
}else if(i==n-1 && j ==m)
gg[2] = 1;
else if(i==n && j == m-1)
gg[3] = 1;
}
}
getchar();
}
if((gg[0] && gg[1]) || (gg[2] && gg[3])){
cout << 0 << endl;
return 0;
}
dfs(1,1); // 跑DFS看有几条通路
isfind = false;
dfs(1,1); // 跑DFS看有几条通路
if(gg[0] || gg[1])
ans = min(ans,1ll);
if(gg[2] || gg[3])
ans = min(ans,1ll);
cout << min(ans,2ll) << endl;
return 0;
}
后面的题目待补