A. Stock Arbitraging
买入时找最小,卖出时找最大。
如果买入的价格 > 卖出的价格,则根本就不买
#include<bits/stdc++.h>
using namespace std;
#define line cout<<"--------"<<endl
typedef long long ll;
const int maxn = 1e5 + 10;
const int INF = 1e9 + 7;
int n, m, r;
int a[maxn], b[maxn];
int main(){
cin >> n >> m >> r;
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
for(int i = 0; i < m; i++)
scanf("%d", &b[i]);
sort(a, a+n);
sort(b, b+m);
int x = r / a[0];
int lef = r % a[0];
int sum = x * b[m-1] + lef;
cout << max(sum, r) << endl;
return 0;
}
B. Tiling Challenge
本来以为要dfs一下,后来想了一下根本不用,从第一行第一列开始向右找,每找到一个‘.’ 就把下方、下下方、右下方、左下方的变成‘#’,如果不能变,则输出‘NO’
#include<bits/stdc++.h>
using namespace std;
#define line cout<<"--------"<<endl
typedef long long ll;
const int maxn = 1e5 + 10;
const int INF = 1e9 + 7;
const int N = 55;
int n, num;
char mp[N][N];
bool vis[N][N];
struct node{
int x, y;
}p[N*N];
int main(){
scanf("%d", &n);
memset(vis, true, sizeof(vis));
for(int i = 1; i <= n; i++){
scanf("%s", mp[i]+1);
}
/*line;line;
for(int i = 0; i <= n; i++){
puts(mp[i]+1);
}*/
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(mp[i][j] == '.'){
vis[i][j] = false;
p[num].x = i; p[num++].y = j;
}
}
}
bool flag = true;
for(int i = 0; i < num; i++){
int x = p[i].x;
int y = p[i].y;
if(!vis[x][y]){
x++;
if(vis[x][y]||vis[x-1][y]||vis[x+1][y]||vis[x][y+1]||vis[x][y-1]){
flag = false; break;
}
else{
vis[x][y]=vis[x-1][y]=vis[x+1][y]=vis[x][y+1]=vis[x][y-1] = true;
}
}
}
if(flag) printf("YES\n");
else printf("NO\n");
return 0;
}
C. Prefix Sum Primes
二分查找下一个素数是几,然后先2后1 的模拟加上去。
#include<bits/stdc++.h>
using namespace std;
#define line cout<<"--------"<<endl
typedef long long ll;
const int maxn = 4e6 + 10;
const int INF = 1e9 + 7;
const int N = 55;
int n, sum, num, l1, l2;
int a[maxn], pri[maxn], b[maxn];
bool p[maxn], vis[maxn];
bool get_prime(){
memset(p, true, sizeof(p));
p[0] = p[1] = false;
for(int i = 2; i*i < maxn; i++){
if(p[i]){
for(int j = 2; i*j < maxn; j++){
p[i*j] = false;
}
}
}
for(int i = 2; i < maxn; i++)
if(p[i]) pri[num++] = i;
}
int main(){
get_prime();
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
sum += a[i];
if(a[i] == 1) l1 ++;
else l2 ++;
}
int id = 0, cnt = 0;
while(id < n){
int pos = upper_bound(pri, pri+num, cnt) - pri;
if(vis[pos]) pos++;
else vis[pos] = true;
int x = pri[pos];
//printf("%d@!!!!!!!!!!!!!!!!\n", x);
while(l2 && cnt+2 <= x){
l2--; cnt += 2;
b[id++] = 2;
}
while(l1 && cnt+1 <= x){
l1--; cnt += 1;
b[id++] = 1;
}
// printf("%d!!!!!!!\n", id);
}
for(int i = 0; i < n-1; i++)
printf("%d ", b[i]);
printf("%d\n", b[n-1]);
return 0;
}