1.Calculus
结论题
题目大意:
给你一个函数式,求他是否收敛。
思路:
第一眼想到的就是收敛的性质,收+收则收,收+发则发,发+发不确定。
然后发现给的函数只有一种可能是收的,就是C==0的时候。
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
using ll = long long;
int main(){
int t;
cin >> t;
while(t--){
string s;
cin >> s;
bool flag = 0;
for(auto x : s){
if(x >= '1' && x <= '9') {
flag = 1;
break;
}
}
if(flag){
cout << "NO\n";
}else{
cout << "YES\n";
}
}
}
2.Kanade Loves Maze Designing
dfs
题目:
n个点, n-1条边,每个点有一个价值。求从点u 到 v 有多少种不同的价值。
思路:
典型dfs, 虽然我不会写,但我也不知道为什么就过了。hhh
存边,遍历。
代码:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define ctx cout << "xxxxxxx" << endl
const int maxn = 2010;
vector<int> G[2010];
const ll mod1 = 1e9 + 7, mod2 = 1e9 + 9;
int v[2010];
const int kk = 19560929;
ll tmp1[2010], tmp2[2010];
void init(int n){
ll x1 = 1, x2 = 1;
for(int i = 1; i <= n; i ++){
tmp1[i] = x1, tmp2[i] = x2;
x1 *= kk, x2 *= kk;
x1 %= mod1, x2 %= mod2;
}
}
int ans[2005][2005];
bool book[2010], vis[2010];
void dfs(int i, int &cnt, int k){
book[v[i]] = 1; vis[i] = 1;
for(auto x : G[i]){
if(vis[x]) continue;
bool flag = 0;
if(!book[v[x]]){
cnt++;
flag = 1;
book[v[i]] = 1;
}
ans[k][x] = cnt, ans[x][k] = cnt;
dfs(x, cnt, k);
if(flag) cnt--, book[v[x]] = 0;
}
}
void solve(){
int n;
cin >> n;
for(int i = 2; i <= n; i++){
ll x;
cin >> x;
G[i].push_back(x);
G[x].push_back(i);
}
memset(v, 0, sizeof(v));
memset(ans, 0, sizeof(ans));
for(int i = 1; i <= n; i++) {
cin >> v[i];
ans[i][i] = 1;
}
for(int i = 1; i <= n; i++){
memset(book, false, sizeof(book));
memset(vis, false, sizeof(vis));
int cnt = 1; book[v[i]] = 1;
dfs(i, cnt, i);
}
for(int i = 1; i <= n; i++){
ll tt1 = 0, tt2 = 0;
for(int j = 1; j <= n; j ++){
tt1 = (tt1 + ans[i][j]*tmp1[j] % mod1) % mod1;
tt2 = (tt2 + ans[i][j]*tmp2[j] % mod2) % mod2;
}
cout << tt1 << ' ' << tt2 << endl;
}
for(int i = 1; i <= n; i++){
G[i].clear();
}
}
int main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
init(2001);
int t;
cin >> t;
while(t--) solve();
}
9.License Plate Recognition
观察题。
题目:给你一个30*100的图面,然后要你输出上面每个字的左右。
思路:
观察发现,处理川,鄂似乎都是在整体连续的。因此我们特殊处理汉字,特殊处理前20行就行,但我感觉这样似乎有点问题,如果数字全是1,再恶心一点,可能会被卡。这里建议找到第一个出现的,然后遍历i+17。
能过就行
代码:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define ctx cout << "xxxxxxx" << endl
int id = 1;
void solve(){
string s;
int a[110];
memset(a, 0, sizeof(a));
for(int i = 1; i <= 30; i++){
cin >> s;
for(int j = 0; j < s.size(); j++){
if(s[j] == '#') a[j] = 1;
}
}
cout << "Case #" << id++ << ":\n";
int l = 0, r = 0;
for(int i = 0; i <= 21; i++){
if(a[i] == 1){
if(l == 0){
l = i;
continue;
}
r = i;
}
}
cout << l+1 << " " << r+1 << endl;
l = 0, r = 0;
for(int i = 22; i < 102; i++){
if(a[i] == 0){
if(l != 0 && r != 0)
{
cout << l+1 << ' ' << r+1 << endl;
l = 0, r = 0;
}
}else{
if(l == 0){
l = i;
continue;
}
r = i;
}
}
}
int main(){
int t;
cin >> t;
while(t--){
solve();
}
}