哈尔滨华德学院-新生编程挑战赛(同步赛)

A签到

用map标记输出过的数组达到去重的目的

#include<bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
     
    map<int, bool> mp;
    vector<int> a(n);
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
     
    for(int i = 0; i < n; i++) {
        if(!mp[a[i]]) {
            cout << a[i] << ' ';
            mp[a[i]] = 1;
        }
    }
    
    return 0;
}

B百分之x的信心

变成百分数形式乘100.0即可

#include<bits/stdc++.h>

using namespace std;

int main() {
    double x;
    cin >> x;
     
    cout << x * 100.0 << "%" << endl;
    
    return 0;
}

C幻方

emm,这题打表找下规律,中间数很好找就是n方加1除2或直接除2向上取整,幻和打表发现和1-n方和有关,等差数列求和然后除n即可

#include<bits/stdc++.h>

using namespace std;

#define ll long long

int main() {
    int n;
    cin >> n;
     
    ll hh = (ll)(1 + n * n) * (n * n) / (2 * n);
    ll zj = (ll)ceil((double)n * n / 2);
     
    cout << hh << ' ' << zj;
    
    return 0;
}

D不是幻方

题目很长题很简单,只看图也能看出来是排序每一列即可

#include<bits/stdc++.h>

using namespace std;

int a[505][505];

int main() {
    int n;
    cin >> n;
     
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            cin >> a[i][j];
        }
    }
     
    vector<int> b;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            b.push_back(a[j][i]);
        }
         
        sort(b.begin(), b.end());
         
        int k = 1;
        for(auto x : b) {
            a[k++][i] = x;
        }
        b.clear();
    }
     
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            cout << a[i][j] << ' ';
        }
        cout << endl;
    }
    
    return 0;
}

E要长脑子辣!!!

暴力求上下式子即可,最后用gcd来化简式子,记得分母开long long

#include<bits/stdc++.h>

using namespace std;

#define endl '\n'
#define ll long long

ll gcd(ll a, ll b) {
    return b ? gcd(b, a % b) : a;
}

void solve() {
	int n, x, y;
    cin >> n >> x >> y;
    
    int sa = 0, sb = 0;
    vector<int> a(n), b(n);
    for(int i = 0; i < n; i++) {
        cin >> a[i];
        sa += a[i];
    } 
    for(int i = 0; i < n; i++) {
        cin >> b[i];
        sb += b[i];
    }
    
    if(n == 0) {
        cout << "0" << endl;
        return;
    }
    
    int s = 0;
    for(int i = 0; i < n; i++) {
        s += (a[i] * b[i]);
    } 
    
    ll A = s, B = pow(sa, x) + pow(sb, y);
    int gd = gcd(A, B);
    
    A /= gd, B /= gd;
    
    if(B == 1) {
        cout << A << endl;
    } else cout << A << "/" << B;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
    int t;
//     cin >> t;
 	t = 1;
    while(t--) {
    	solve();
    }
    	
    return 0;
}

FHuadeyyds

用substr求串中几个Huade,如果一个都没有,输出0返回,如果有那么定义str来放入Huade前面的字符串,然后插入Huadeyyds,i要跳过Huade即i+=4

#include<bits/stdc++.h>

using namespace std;

void solve() {
	string s;
    cin >> s;
    
    int ans = 0;
    for (int i = 0; i < s.size() - 4; i++) {
        if(s.substr(i, 5) == "Huade") {
            ans++;
        }
    }
    
    if(!ans) {
        cout << "0" << endl;
        return;
    }
    
    cout << ans << endl;
    
    string str;
    for(int i = 0; i < s.size(); i++) {
        if(s.substr(i, 5) == "Huade") {
            str += s.substr(i, 5);
            str += "yyds";
            i += 4;
        } else {
            str += s[i];
        }
    }
    
    cout << str;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
    int t;
//     cin >> t;
 	t = 1;
    while(t--) {
    	solve();
    }
    	
    return 0;
}

H神奇"?"

以i为左端点(因为后面要遍历完st的长度,所以i只遍历到s的长度减去st的长度),用flag来标记是否有s和st不相等并且s中还不是?,如果有那么flag标记错误break(有一个不一样就不是,i就可以往下一个端点去了),当然如果满足除了?外都相等那么答案就++(?可以变任何小写字母相当于和st对应位置的字母相等)

#include<bits/stdc++.h>

using namespace std;

int f(string s, string st) {
    int ans = 0;
    int n = s.length();
    int m = st.length();
    
    for(int i = 0; i <= n - m; i++) {
        bool flag = true;
        for(int j = 0; j < m; j++) {
            if(s[i + j] != st[j] && s[i + j] != '?') {
                flag = false;
                break;
            }
        }
        if(flag) {
            ans++;
        }
    }
    
    return ans;
}

int main() {
	string s;
    cin >> s;
    
    string st;
    cin >> st;
    
    cout << f(s, st);
    	
    return 0;
}

ICrazy小飞象!

算是bfs的模板吧,不过移动的距离要改一下,毕竟象是飞田的hhh

#include<bits/stdc++.h>

using namespace std;

#define fi first
#define se second

typedef pair<int, int> PII;
queue<PII> q;

int dx[4] = {-2, -2, 2, 2}, dy[4] = {-2, 2, 2, -2};

int d[405][405];
int n, m , x, y;

void bfs(int x, int y) {
    d[x][y] = 0;
    
    q.push({x, y});
    while(!q.empty()) {
        auto f = q.front();
        q.pop();
        
        for(int i = 0; i < 4; i++) {
            int x = f.fi + dx[i];
            int y = f.se + dy[i];
            if(x >= 1 && x <= n && y >= 1 && y <= m && d[x][y] == -1) {
                d[x][y] = d[f.fi][f.se] + 1;
                q.push({x, y});
            }
        }
    }
}

int main() {
	cin >> n >> m >> x >> y;
    
    memset(d, -1, sizeof d);
    
    bfs(x, y);
    
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            cout << d[i][j] << ' ';
        }
        cout << endl;
    }
    	
    return 0;
}

J幸存者

每经历过一个人就过了一个回合,每过k个回合到当前枪手的位置枪手会向下一个人开枪,下一个人就会挂掉(用map标记false即挂掉hhh)因为是向下一个人开枪所以我cnt初值赋的-1这样cnt回合++到k回合时其实就是当前枪手挂掉

#include<bits/stdc++.h>

using namespace std;

int main() {
    int n, k;
    cin >> n >> k;
     
    map<int, bool> mp;
    vector<int> a(n + 1);
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        mp[a[i]] = false;
    }
     
    int cnt = -1;
    int count = 0;
    for(int i = 1; i <= n; i++) {
        if(cnt == k && !mp[a[i]]) {
            mp[a[i]] = true;
            cnt = 0;
            cout << a[i] << ' ';
            count++;
        }
        if(!mp[a[i]] && cnt != k) {
            cnt++;
        }
        if(i == n) i = 0;
        if(count == n - 1) break;
    }
    
    return 0;
}

K喝"水"题

高中知识直接半球体积加大圆锥减小圆锥即可(直接求圆台体积也行)

#include<bits/stdc++.h>

using namespace std;

int main() {
    int R, r, H, h;
    cin >> R >> r >> H >> h;
     
    double qiu, pi = 3.14;
    qiu = (2.0 * pi * pow(R, 3)) / 3.0;
     
    double y1, y2, yt;
    int h2 = H - h;
     
    double s1 = pi * pow(r, 2);
    double s2 = pi * pow(R, 2);
    y1 = (1.0 * s1 * h) / 3.0;
    y2 = (1.0 * s2 * H) / 3.0;
     
    yt = y2 - y1;
     
    printf("%.2lf", (yt + qiu));
    
    return 0;
}

L是不涉及懒标记的线段树,本人也是懒得一批一直觉得线段树很难没有去学qwq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值