中石大第41次CSP培训Week2题解
A.字符串哈希
思路
STL- map
AC代码
void solve(){
int n;
cin >> n;
map<string, int> mp;
for(int i = 1; i <= n ; i ++ ){
string s;
cin >> s;
mp[s] ++;
}
cout << mp.size() << endl;
return ;
}
B.第40次CSP认证第一题:集合(set)
思路
模拟
AC代码
bool f1(int i){
if(s[i].size() != t[i].size()){
return false;
}
for(int j = 0; j < s[i].size(); j ++ ){
if(s[i][j] != t[i][j]){
return false;
}
}
return true;
}
bool f2(int i){
int x = 0, y = 0;
for(int j = 0; j < s[i].size() ; j ++ ){
x ^= a[s[i][j]];
}
for(int j = 0; j < t[i].size() ; j ++ ){
y ^= a[t[i][j]];
}
return x == y;
}
void solve(){
cin >> n >> m;
for(int i = 1; i <= n; i ++ ){
cin >> a[i];
}
for(int i = 1; i <= 2 * m ; i ++ ){
int num;
cin >> num;
while(num --){
int e;
cin >> e;
if(i <= m)s[i].pb(e);
else t[i - m].pb(e);
}
}
for(int i = 1; i <= m ; i ++ ){
cout <<( f1(i) ^ f2(i) ? "wrong" : "correct")<< endl;
}
return ;
}
C.第40次CSP认证第二题:数字变换 (transform)
思路
预处理
AC代码
int f(int x, int k){
return ((x * x + k * k) % 8 ) ^ k;
}
int g(int x, int k){
int a = (x >> 6) & 7;
int b = (x >> 3) & 7;
int c = x & 7;
return ((b << 6) + ((c ^ f(b, k)) << 3) + (a ^ f(c, k)));
}
void init(){
cin >> n >> m;
for(int i = 1; i <= m ; i ++ ){
cin >> k[i];
}
for(int i = 0; i < 512; i ++ ){
int e = i;
for(int j = 1; j <= m ; j ++ ){
e = g(e, k[j]);
}
ans[e] = i;
}
}
void solve(){
cin >> a;
cout << ans[a] << " ";
return ;
}
signed main()
{
fast();
init();
while(n--){
solve();
}
return 0;
}
D.全排列问题
思路
DFS
AC代码
void dfs(int x){
if(x > n){
for(int i = 1; i <= n ; i ++ ){
cout << " " << ans[i];
}
cout << endl;
return ;
}
for(int i = 1; i <= n ; i ++ ){
if(!st[i]){
st[i] = true;
ans[x] = i;
dfs(x + 1);
st[i] = false;
}
}
return ;
}
void solve(){
cin >> n;
memset(st, false, sizeof st);
dfs(1);
}
E.第38次CSP认证第二题:机器人复健指南
思路
BFS
AC代码
int dx[8] = {2, 2, 1, 1, -2, -2, -1, -1};
int dy[8] = {1, -1, 2, -2, 1, -1, 2, -2};
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 ;
}
F.排队接水
思路
贪心——排序
AC代码
void solve(){
cin >> n;
a[0] = {0, 0};
for(int i = 1; i <= n; i ++ )cin >> a[i].first, a[i].second = i;
sort(a + 1, a + 1 + n);
for(int i = 1; i <= n; i ++ )a[i].first += a[i - 1].first, cout << a[i].second << " ";
cout << endl;
for(int i = 1; i <= n; i ++ )ans += a[i - 1].first * 1.0;
printf("%.2lf", ans/n*1.0);
return ;
}
G.小A的糖果
思路
贪心
AC代码
void solve(){
int n, m;
cin >> n >> m;
int a[n + 1];
for(int i = 1; i <= n; i ++ ){
cin >> a[i];
}
int ans = 0;
for(int i = 2; i <= n; i ++ ){
if(a[i] + a[i - 1] > m){
ans += a[i] + a[i - 1] - m;
if(a[i] < a[i] + a[i - 1] - m){
a[i] = 0;
}
else a[i] -= a[i] + a[i - 1] - m;
}
}
cout << ans << endl;
}

浙公网安备 33010602011771号