携程4.15笔试
T1 签到题
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<vector<char>> v(n, vector<char> (m));
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin >> v[i][j];
int res = 0;
for(int i = 1; i < n; i++) {
for(int j = 1; j < m; j++) {
if((v[i-1][j-1] == 'y' || v[i-1][j] == 'y' || v[i][j-1] == 'y' || v[i][j] == 'y'))
if((v[i-1][j-1] == 'o' || v[i-1][j] == 'o' || v[i][j-1] == 'o' || v[i][j] == 'o'))
if((v[i-1][j-1] == 'u' || v[i-1][j] == 'u' || v[i][j-1] == 'u' || v[i][j] == 'u'))
res++;
}
}
cout << res << endl;
}
T2 发现了128位整型数
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
__uint128_t gcd(__uint128_t a, __uint128_t b) {
while(b != 0) {
__uint128_t tmp = b;
b = a % b;
a = tmp;
}
return a;
}
int main() {
int t;
cin >> t;
while(t--) {
uint64_t t;
cin >> t;
__uint128_t n = t;
__uint128_t max_ = 0, a = 1, b = n - 1;
for(__uint128_t i = n / 2; i >= 1; i--) {
if(i * (n - i) < max_) break;
__uint128_t tmp = i / gcd(i, n - i) * (n - i);
if(tmp > max_) {
max_ = tmp;
a = i;
b = n - i;
}
}
uint64_t c = a, d = b;
cout << c << ' ' << d << endl;
}
}
T3 dfs暴力
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
uint64_t s2i(string s) {
uint64_t r = 0;
for(auto& p : s) {
r = r * 2;
if(p == '1') r++;
}
return r;
}
uint64_t res = 0;
void dfs(vector<vector<int>>& v, vector<vector<int>>& vis, int now, int head, uint64_t val, uint64_t l, uint64_t r, string& s, int n) {
if(val >= l && val <= r && now != head) res++;
if(val > r) return;
for(int i = 1; i <= n; i++) {
if(v[now][i] == 1 && !vis[head][i]) {
uint64_t tmp = val * 2;
if(s[i-1] == '1') tmp++;
vis[head][i] = 1;
v[now][i] = 0;
v[i][now] = 0;
dfs(v, vis, i, head, tmp, l, r, s, n);
// vis[head][i] = 0;
v[now][i] = 1;
v[i][now] = 1;
}
}
}
int main() {
int n;
uint64_t l, r;
cin >> n >> l >> r;
vector<vector<int>> v(n + 1, vector<int>(n + 1, 0));
vector<vector<int>> vis(n + 1, vector<int>(n + 1, 0));
string s;
cin >> s;
int a, b;
for(int i = 0; i < n - 1; i++) {
cin >> a >> b;
v[a][b] = 1;
v[b][a] = 1;
}
for(int i = 1; i <= n; i++){
uint64_t val = 0;
if(s[i-1] == '1') val++;
dfs(v, vis, i, i, val, l, r, s, n);
}
cout << res << endl;
}
T4 中心扩散
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
uint64_t mod = 1000000007;
int n;
cin >> n;
vector<uint64_t> v(n);
uint64_t res = 0;
for(int i = 0; i < n; i++) cin >> v[i];
for(int i = 0; i < n; i++) {
uint64_t tmp;
if(v[i] % 2 == 0) tmp = v[i] / 2 * (v[i] + 1);
else tmp = (v[i] + 1) / 2 * v[i];
res = (res + tmp) % mod;
int l = i - 1, r = i + 1;
while(l >= 0 && r < n) {
if(v[l] == v[r]) {
res = (res + v[l]) % mod;
l--;
r++;
}
else {
res = (res + min(v[l], v[r])) % mod;
break;
}
}
}
cout << res << endl;
}
