A1 Death Stars (easy)
旋转、水平垂直翻转,枚举之后判断一下就可以了
#include<iostream>
using namespace std;
int n;
bool match(int ma[10][10], int mb[10][10])
{
bool t= true;
for (int i=0;i<n;++i)
for (int j=0;j<n;++j)
if (ma[i][j] != mb[i][j])
{
t = false;
i = n;
j = n;
}
return t;
}
int main()
{
int ma[10][10], mb[10][10];
cin >> n;
for (int i=0;i<n;++i)
for (int j = 0; j < n; ++j)
{
char c;
cin >> c;
if (c == 'X') ma[i][j] = 1;
else if (c == 'O') ma[i][j] = 0;
}
for (int i = 0; i<n; ++i)
for (int j = 0; j < n; ++j)
{
char c;
cin >> c;
if (c == 'X') mb[i][j] = 1;
else if (c == 'O') mb[i][j] = 0;
}
for (int p = 0; p < 4; ++p)
{
for (int i=0;i<n;++i)
for (int j = n - 1; j >= n/2; --j)
{
int c = ma[i][j];
ma[i][j] = ma[i][n - j - 1];
ma[i][n - j - 1] = c;
}
if (match(ma, mb))
{
cout << "Yes" ;
return 0;
}
for (int i = n - 1; i>=n / 2; --i)
for (int j = 0; j <n ; ++j)
{
int c = ma[i][j];
ma[i][j] = ma[n-i-1][j];
ma[n - i - 1][j] = c;
}
if (match(ma, mb))
{
cout << "Yes" ;
return 0;
}
for (int i = 0; i<n; ++i)
for (int j = n - 1; j >= n / 2; --j)
{
int c = ma[i][j];
ma[i][j] = ma[i][n - j - 1];
ma[i][n - j - 1] = c;
}
if (match(ma, mb))
{
cout << "Yes" ;
return 0;
}
for (int i = n - 1; i>=n / 2; --i)
for (int j = 0; j <n; ++j)
{
int c = ma[i][j];
ma[i][j] = ma[n - i - 1][j];
ma[n - i - 1][j] = c;
}
if (match(ma, mb))
{
cout << "Yes" ;
return 0;
}
int mc[10][10];
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
mc[i][j] = ma[n - j - 1][i];
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
ma[i][j] = mc[i][j];
}
cout << "No";
return 0;
}
B1 Maximum Control (easy)
从任意一点做一次DFS计数
#include<bits/stdc++.h>
using namespace std;
const int nmax = 1e6 +10;
const int INF = 0x3f3f3f3f;
typedef struct{
int nxt, to;
}Edge;
Edge e[nmax<<2];
int head[nmax<<2];
bool visit[(int) 1e3 + 10];
int n,tot = 0,ans = 0;
void add(int u, int v){
e[tot].to = v;
e[tot].nxt = head[u];
head[u] = tot++;
}
void dfs(int u, int fa){
bool isin = false;
visit[u] = true;
for(int i = head[u];i!=-1;i=e[i].nxt){
int v = e[i].to;
if(v!=fa) isin = true;
if(v != fa) dfs(v,u);
}
if(!isin) ans++;
return;
}
int main(){
memset(head,-1,sizeof head);
scanf("%d",&n);
int u,v;
for(int i = 0;i<n-1;++i){
scanf("%d %d",&u,&v);
add(u,v), add(v,u);
}
dfs(1,-1);
int cnt = 0;
for(int i = head[1];i!=-1;i = e[i].nxt) cnt++;
if(cnt == 1) ans++;
printf("%d\n",ans);
return 0;
}
C1 Encryption (easy)
预处理前缀和,扫描一边即可
#include<bits/stdc++.h>
using namespace std;
const int nmax = 1e5+100;
const int INF = 0x3f3f3f3f;
typedef long long ll;
ll a[nmax];
ll prefix[nmax];
int n;
ll p;
int main(){
scanf("%d %I64d",&n,&p);
for(int i = 1;i<=n;++i){
scanf("%I64d",&a[i]);
prefix[i] = prefix[i-1] + a[i];
}
ll part1 = 0, part2 = 0;
ll ans = -1 ;
for(int i = 1;i<= n-1;++i){
part1 = (prefix[i] - prefix[0]) % p;
part2 = (prefix[n] - prefix[i]) %p;
ans = max(ans,part1 + part2);
}
printf("%I64d\n",ans);
return 0;
}
D1 Hyperspace Jump (easy)
化简成最简分数,放到map里面,最后依次输出答案即可
#include<bits/stdc++.h>
using namespace std;
const int nmax = 1e6+10;
const int INF = 0x3f3f3f3f;
map<int,int> mp;
int n;
int a,b,c;
int fomular[nmax];
int main(){
scanf("%d",&n);
for(int i = 0;i<n;++i){
while(getchar() != '(');
scanf("%d",&a);
getchar();
scanf("%d",&b);
getchar();
getchar();
scanf("%d",&c);
int t = a+b;
int gcd = __gcd(t,c);
t /= gcd, c /= gcd;
int in = t*100 + c;
mp[in]++;
fomular[i] = in;
}
for(int i = 0;i<n;++i){
if(!i) printf("%d",mp[fomular[i]]);
else printf(" %d",mp[fomular[i]]);
}
printf("\n");
return 0;
}
E1 Guard Duty (easy)
暴力枚举所有情况,然后依次判断即可
#include<iostream>
#include<cstring>
using namespace std;
struct node
{
int x, y;
};
int r, b;
int a[10];
int used[10];
node m[10], n[10];
bool match()
{
for (int i=0;i<r;++i)
for (int j = i+1; j < r; ++j)
{
float f1= (m[j].y - m[i].y) * (m[i].x - n[a[j]].x) - (m[j].x - m[i].x) * (m[i].y - n[a[j]].y);
float f2 = (n[a[i]].y - m[i].y) * (m[i].x - n[a[j]].x) - (n[a[j]].x - m[i].x) * (m[i].y - n[a[j]].y);
if (f1*f1<= 0)
return 0;
}
return 1;
}
bool xtry(int n)
{
if (n == r)
return match();
for (int i = 0; i < r; ++i)
{
if (!used[i]) {
used[i] = 1;
a[n] = i;
if (xtry(n+1)) return 1;
used[i] = 0;
}
}
}
int main()
{
cin >> r >> b;
for (int i = 0; i < r; ++i)
cin >> m[i].x >> m[i].y;
for (int i = 0; i < b; ++i)
cin >> n[i].x >> n[i].y;
if (r != b) {
cout << "No";
return 0;
}
memset(a, 0, sizeof(a));
memset(used, 0, sizeof(used));
if (xtry(0)) cout<<"Yes";
else cout << "No";
}
F1 Lightsabers (easy)
枚举区间终点起点,暴力统计
#include<bits/stdc++.h>
using namespace std;
const int nmax = 100000;
const int INF = 0x3f3f3f3f;
int n,m;
int a[nmax],k[nmax];
int mtype[nmax];
int tar[nmax];
int sum = 0;
bool getans(){
int temp[105] = {0};
for(int i = 1;i<= n - sum + 1;++i){
memset(temp,0,sizeof temp);
bool thistime = true;
for(int j = 1;j<=sum;++j){
temp[a[i+j-1]]++;
}
for(int i = 1;i<=m;++i){
if(temp[i] != k[i]){
thistime = false;
break;
}
}
if(thistime) {return true;}
}
return false;
}
int main(){
// freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i = 1;i<=n;++i) scanf("%d",&a[i]);
for(int i = 1;i<=m;++i) {scanf("%d",&k[i]); sum += k[i];}
// int index = 1;
printf("%s\n",getans()?"YES":"NO");
return 0;
}