中石大第40次CSP培训Week1题解
A.统计数字
思路
map
AC代码
int n;
map<int, int> mp;
void solve(){
cin >> n;
for(int i = 1; i <= n ; i ++ ){
int x;
cin >> x;
mp[x] ++;
}
for(auto i :mp){
cout << i.first << " "<< i.second << endl;
}
return ;
}
B.魔法少女小Scarlet
思路
模拟
AC代码
int n, m;
int g[N][N];
int t[N][N];
int e = 1;
void f(int x0, int y0, int l, int z){
if (z == 0){
for(int i = 1; i <= l ; i ++ ){
for(int j = 1 ; j <= l; j ++ ){
t[j][l - i + 1] = g[x0 + i - 1][y0 + j - 1];
/*
拆解:
t[i][j] = g[x0 + i - 1][y0 + j - 1];
t[j][l - i + 1] = t[i][j];
*/
}
}
for(int i = 1; i <= l ; i ++ ){
for(int j = 1 ; j <= l; j ++ ){
g[x0 + i - 1][y0 + j - 1] = t[i][j];
}
}
}
else{
for(int i = 1; i <= l ; i ++ ){
for(int j = 1 ; j <= l; j ++ ){
t[l - j + 1][i] = g[x0 + i - 1][y0 + j - 1];
}
}
for(int i = 1; i <= l ; i ++ ){
for(int j = 1 ; j <= l; j ++ ){
g[x0 + i - 1][y0 + j - 1] = t[i][j];
}
}
}
return ;
}
void solve(){
cin >> n >> m;
e = 1;
for(int i = 1; i <= n ; i ++ ){
for(int j = 1 ; j <= n ; j ++ ){
g[i][j] = e;
e ++;
}
}
while( m -- ){
int x, y, r, z;
cin >> x >> y >> r >> z;
int x0 = x - r;
int y0 = y - r;
int l = 2 * r + 1;
f(x0, y0, l, z);
}
for(int i = 1; i <= n ; i ++ ){
for(int j = 1 ; j <= n ; j ++ ){
cout << g[i][j] << " ";
}
cout << endl;
}
return ;
}
C.第39次CSP认证第二题—水印检查
思路
模拟
AC代码
int n, l;
int csp[5][9];
int g[N][N];
map<int,int> ans;//可能会重复,使用map去掉重复的元素
void init() {
csp[1][1] = csp[1][2] = csp[1][4] = csp[1][5] = csp[1][7] = 1;
csp[2][1] = csp[2][2] = csp[2][8] = 1;
csp[3][1] = csp[3][2] = csp[3][3] = csp[3][4] = csp[3][7] = csp[3][8] = 1;
csp[4][7] = csp[4][8] = 1;
}
void solve(){
cin >> n >> l;
for(int i = 1; i <= n ; i ++ ){
for(int j = 1 ; j <= n ; j ++ ){
cin >> g[i][j];
}
}
init();
for(int k = 0; k <= l - 1; k ++ ){
bool key = false;
for(int i = 1 ; i <= n - 4; i ++ ){
for(int j = 1; j <= n - 8 ;j ++ ){
int num = 0;
for(int x = 0; x <= 4; x ++ ){
for(int y = 0; y <= 8; y ++ ){
if(csp[x][y] == 0 && g[i + x][j + y] >= k)num ++ ;
else if(csp[x][y] == 1 && g[i + x][j + y] < k)num ++;
}
}
if(num == 5 * 9)key = true;
}
}
if(key)ans[k]++;
}
for(auto & i: ans)cout << i.first << endl;
return ;
}
D.健康的荷斯坦奶牛 Healthy Holsteins
思路
DFS
AC代码
int n, m;
int a[N];
int g[N][N];
bool st[N];
string ans(30,'a');
void dfs(int x){
if(x > m){
string t = "";
int sum[N];
memset(sum, 0 ,sizeof sum);
for(int i = 1; i <= m ; i ++ ){
if(st[i]){
t += (char)(i + '0');
for(int j = 1; j <= n ; j ++ ){
sum[j] += g[i][j];
}
}
}
//cout << t << "->" ;
for(int i = 1; i <= n ; i ++ ){
//cout << sum[i] << "->" << a[i] << endl;
if(sum[i] < a[i]){
//cout << "No" << endl;
return ;
}
}
//cout << "Yes" << endl;
if(ans.size() > t.size()){
ans = t;
}
else if(ans.size() == t.size() && ans > t){
ans = t;
}
//cout << ans << endl;
return ;
}
st[x] = true;
dfs(x + 1);
st[x] = false;
dfs(x + 1);
return ;
}
void solve(){
cin >> n ;
for(int i = 1 ; i <= n ; i ++ ){
cin >> a[i];
}
cin >> m;
for(int i = 1; i <= m ; i ++ ){
for(int j = 1; j <= n ; j ++ ){
cin >> g[i][j];
}
}
memset(st, false, sizeof st);
dfs(1);
cout << ans.size() << " ";
for(auto i : ans){
cout << i - '0' << " ";
}
return ;
}
E.第38次CSP认证第二题:机器人复健指南
思路
BFS
AC代码
int n, k;
int sx, sy;
int dx[8] = {2, 2, 1, 1, -2, -2, -1, -1};
int dy[8] = {1, -1, 2, -2, 1, -1, 2, -2};
int num[N][N];
int ans = 1;
void bfs(){
queue<PII> q;
memset(num, -1, sizeof num);
num[sx][sy] = 0;
q.push({sx, sy});
while(q.size()){
int x = q.front().first;
int y = q.front().second;
q.pop();
for(int i = 0; i < 8; i ++ ){
int x0 = x + dx[i];
int y0 = y + dy[i];
if(x0 >= 1 && x0 <= n && y0 >= 1 && y0 <= n && num[x0][y0] == -1){
ans ++;
num[x0][y0] = num[x][y] + 1;
if(num[x0][y0] < k)q.push({x0, y0});
}
}
}
}
void solve(){
cin >> n >> k >> sx >> sy;
bfs();
cout << ans << endl;
return ;
}

浙公网安备 33010602011771号