T1:算术三元组的数目
给你一个下标从 0 开始、严格递增 的整数数组 nums 和一个正整数 diff 。如果满足下述全部条件,则三元组 (i, j, k) 就是一个 算术三元组 :
i < j < k ,
nums[j] - nums[i] == diff 且
nums[k] - nums[j] == diff
返回不同 算术三元组 的数目。
这个题思路很简单,就是固定三元组中间元素的位置,然后遍历数组,寻找满足条件的三元组。
class Solution {
public:
int arithmeticTriplets(vector<int>& nums, int diff) {
int res = 0;
int a = 1 ;
while(a<=nums.size()-2){
for(int i = 0; i < a ; i++ ){
if(nums[a] -nums[i] == diff){
for(int j = a+1; j < nums.size() ;j++){
if(nums[j]-nums[a] ==diff) res ++;
}
}
}
a++;
// cout << a<< endl;
}
return res;
}
};
T2:受限条件下可达节点的数目
现有一棵由 n 个节点组成的无向树,节点编号从 0 到 n - 1 ,共有 n - 1 条边。
给你一个二维整数数组 edges ,长度为 n - 1 ,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restricted 表示 受限 节点。
在不访问受限节点的前提下,返回你可以从节点 0 到达的 最多 节点数目。
注意,节点 0 不 会标记为受限节点。
class Solution {
int res = 0;
void dfs(vector<vector<int>>& nums, int loc){
if(nums[loc][0] == 0){
nums[loc][0] = 1;
res ++;
for(int i = 1; i < nums[loc].size() ;i++){
dfs(nums,nums[loc][i]);
}
}
}
public:
int reachableNodes(int n, vector<vector<int>>& edges, vector<int>& restricted) {
vector<vector<int> > nums(n,vector<int>(1,0));
for(int i=0;i<restricted.size();i++){//领接表第一个点表示是否可以访问
nums[restricted[i]][0]=-1;
}
for(int i=0;i<edges.size();i++){
nums[edges[i][0]].push_back(edges[i][1]);//无向图
nums[edges[i][1]].push_back(edges[i][0]);
}
dfs(nums,0);//从0开始
return res;
}
};
ACwing
T1:数对数量
请计算,共有多少个整数数对 (x,y) 同时满足:
0≤x≤a
0≤y≤b
x+y=n
例如,当 a=5,b=6,n=3 时,共有 4 个满足条件的数对:(0,3),(1,2),(2,1),(3,0)。
输入格式
第一行包含整数 a。
第二行包含整数 b。
第三行包含整数 n。
输出格式
一个整数,表示满足条件的数对数量。
数据范围
前三个测试点满足 1≤a,b≤10,1≤n≤a+b。
所有测试点满足 1≤a,b≤300,1≤n≤a+b。
这个题目直接就是两个for循环,遍历就好了。因为数据量很小,可以直接枚举出所有情况。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int res = 0;
int main(){
int a , b , n ;
cin >> a ;
cin >> b ;
cin >> n ;
// int c = min(a,b);
for(int x = 0 ; x <= a ; x++){
for(int y = b ; y >=0 ; y--){
if(x + y == n) res ++;
}
}
cout << res ;
}
T2:字符串消除
李华和张红正在玩字符串消除游戏。
游戏规则如下:
给定一个由小写字母构成的字符串 s。
两人轮流进行消除操作,当轮到一人时,其任务是在当前 s 中找到两个连续且相同的字母,并将它们从 s 中消除。例如,当 s 为 abba 时,可以消除 bb,使 s 变为 aa。
第一个无法进行消除操作的选手视为失败。
已知,游戏由李华执先手,且两人都采取最优策略。
请问,李华是否可以获胜。
输入格式
一行,一个字符串 s。
输出格式
如果李华可以获胜,则输出 Yes,否则输出 No。
数据范围
前 5 个测试点满足 1≤|s|≤10。
所有测试点满足 1≤|s|≤105。
这个题目在比赛的时候想到了通过判断可以消除的对数是奇数还是偶数来判断能否获胜,但是在统计次数的时候出现了一点小问题。
这里可以采用类似于栈的一个思想,定义一个空字符串,将s里面的元素一次加入,遇到两个相同的元素就移除,并统计次数。这样就可以统计可以消除的次数了。若次数为偶数,则李华不能胜出,反之可以。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
string s ,v ;
int res;
int main(){
cin >> s;
for(int i = 0; i < s.size() ; i++){
v += s[i];
while(v.size() >= 2 && v[v.size()-1] == v[v.size() - 2]){
v.erase(v.begin()+v.size() -2 , v.end());
res ++;
}
}
if(res % 2 == 0)
cout << "No" << endl;
else
cout << "Yes" << endl;
return 0;
}