AtCoder Beginner Contest 266
A - Middle Letter
#include<bits/stdc++.h>
using namespace std;
int32_t main() {
string s;
cin >> s;
cout << s[ (s.size()+1) / 2 - 1 ];
return 0;
}
B - Modulo Number
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int n;
int32_t main() {
cin >> n;
n = ( n % mod + mod ) % mod;
cout << n << "\n";
}
C - Convex Quadrilateral
给一个四边形,判断是不是一个凸多边形。对于一个凸四边形,任意一个点都不在其他三个点构成的一个三角形中。
然后就是判断在是否在三角形内。
#include <iostream>
#include <math.h>
using namespace std;
struct Point {
double x;
double y;
};
double product(Point p1,Point p2,Point p3) {
//首先根据坐标计算p1p2和p1p3的向量,然后再计算叉乘
//p1p2 向量表示为 (p2.x-p1.x,p2.y-p1.y)
//p1p3 向量表示为 (p3.x-p1.x,p3.y-p1.y)
return (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);
}
bool isInTriangle(Point p1,Point p2,Point p3,Point o) {
//保证p1,p2,p3是逆时针顺序
if(product(p1, p2, p3)<0) return isInTriangle(p1,p3,p2,o);
if(product(p1, p2, o)>0 && product(p2, p3, o)>0 && product(p3, p1, o)>0)
return true;
return false;
}
int main() {
Point a , b , c , d;
cin >> a.x >> a.y;
cin >> b.x >> b.y;
cin >> c.x >> c.y;
cin >> d.x >> d.y;
bool flag;
flag = isInTriangle(a , b , c , d );
if(flag) puts("No") , exit(0);
flag = isInTriangle( b , c , d , a );
if(flag) puts("No") , exit(0);
flag = isInTriangle( c , d , a , b );
if(flag) puts("No") , exit(0);
flag = isInTriangle(d , a , b , c );
if(flag) puts("No") , exit(0);
cout << "Yes\n";
}
D - Snuke Panic (1D)
有五个洞,每单位时间只能移动一步,给出若干时间,每个时间在某个洞的得分,问最多能得多少分。
f[i][j]
表示在时间i
洞j
能得到的最大分数,则f[i][j] = max( f[i-1][j] , f[i-1][j-1] , f[i-1][j+1])
,如果时间i
有得分点的话,在加上得分点就好。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 15e+5;
int f[N][5] , t[N] , w[N] , v[N] , n ;
int read() {
int x = 0, f = 1, ch = getchar();
while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
if (ch == '-') f = -1, ch = getchar();
while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
return x * f;
}
int32_t main() {
n = read();
for( int i = 1 ; i <= n ; i ++ ) t[i] = read() , w[i] = read() , v[i] = read();
f[0][1] = f[0][2] = f[0][3] = f[0][4] = LONG_MIN;
for( int i = 1 , j = 1 , wj , vj ; i <= t[n] ; i ++ ){
f[i][0] = max( f[i-1][0] , f[i-1][1] );
f[i][4] = max( f[i-1][4] , f[i-1][3] );
for( int k = 1 ; k <= 3 ; k ++ )
f[i][k] = max( f[i-1][k] , max( f[i-1][k-1] , f[i-1][k+1] ) );
if( t[j] == i ) f[i][w[j]] += v[j] , j ++;
}
int res = LONG_MIN;
for( int i = 0 ; i <= 4 ; i ++ )
res = max( res , f[t[n]][i] );
cout << res << "\n";
return 0;
}