2021暑期杭电多校4:1,2,9

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();
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值