题意:给你三个区间,要你在这三个区间选三条边使得它成为一个三角形。
思路:签到题,直接输出一个等腰三角形,b,c,c即可。
时间复杂度O(1)
代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long int ll;
const int maxn = 1e5 + 10;
void solved(){
	int t;cin>>t;
	while(t--){
		ll a,b,c,d;cin>>a>>b>>c>>d;
		cout<<b<<" "<<c<<" "<<c<<endl;
	}
}
int main(){
	solved();
	return 0;
}



题意:
给你怪兽的血量h,你有两个技能,第一个技能堆怪兽造成 h / 2 + 10的伤害,第二个技能对怪兽造成h - 10 的伤害,现在你有n次第一个技能使用机会和m的第二技能使用机会,问题是否能够杀死怪兽。
思路:
当怪兽血量很高第一个技能更有效,但是当血量第显然第二个技能要好,直接贪心用第一个技能,当怪兽血量<=10我们马上用第二个技能,防止用第一个技能血量增加。
时间复杂度O(n)
代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long int ll;
const int maxn = 1e5 + 10;
void solved(){
	int t;cin>>t;
	while(t--){
		int x,n,m;cin>>x>>n>>m;
		while(n--){
			if(m > 0 && x <= 10){
				m --;x= 0;break;
			}
			x/=2,x+=10;
		}
		if(m * 10 >= x)cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
}
int main(){
	solved();
	return 0;
}




题意:
给你一颗树,每个节点可以做成工业城市,也可以做成旅游城市,现在要你选k个工业公式,使得他们到根节点1经过的旅游城市值最大,答案就是这些城市经过旅游城市数量之和。
思路:
计算每个节点贡献,一个节点贡献= 它的深度 - 它的子节点个数。统计完贡献后排序选前k大即可。
时间复杂度O(n + e)
代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long int ll;
const int maxn = 1e6 + 100;
struct edge{
	ll v,next;
	edge(){}
	edge(ll a,ll b):v(a),next(b){};
}e[maxn << 1];
ll head[maxn],tot;
ll v[maxn];
ll dep[maxn],son[maxn];
void add(int from,int to){
	e[++tot].v = to;
	e[tot].next = head[from];
	head[from] = tot;
}
void dfs(ll u,ll fa,ll d){
	dep[u] = d ;
	son[u] = 1;
	for(int i = head[u]; i ; i = e[i].next){
		if(e[i].v != fa){
			dfs(e[i].v,u,d + 1);
			son[u] += son[e[i].v]; 
		}
	}
}
bool cmp(ll a,ll b){
	return a>b;
}
void solved(){
	ll n,k;cin>>n>>k;
	for(ll i = 1; i < n; i++){
		ll u,v;cin>>u>>v;
		add(u,v);add(v,u);
	}
	dfs(1,0,0);
	for(ll i = 1; i <= n; i++){
		v[i] = dep[i] - (son[i] - 1);
	}
	sort(v + 1, v + 1 + n,cmp);
	ll ans = 0;
	for(ll i = 1; i <= k; i++)ans += v[i];
	cout<<ans<<endl; 
}
int main(){
	solved();
	return 0;
}




题意:给你三个数组,现在要你从三个数组从任选一个数,使得(x - y) ^ 2 + (y - z) ^ 2 + (z - x) ^ 2最小。
思路:
枚举一个中心点,二分出第一个大于等于它和第一个小于等于它的数,计算答案即可。
因为只有三个数组枚举中心点无非就是abc,acb,bac,bca,cab,cba,最多也就6中情况全部算出即可。
总的时间复杂度O(nlogn)。
代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long int ll;
const int maxn = 1e5 + 10;
const ll inf = 5e18;
ll a[maxn],b[maxn],c[maxn];
ll mul(ll a){return a * a;}
ll cal(ll *a,ll *b,ll *c,int n,int m,int q){
	ll res = inf;
	for(int i = 1; i <= n; i++){
		if(c[1] <= a[i]){
			int pos = lower_bound(b + 1, b + 1 + m,a[i]) - b;
			if(b[pos] == inf)continue;
			int l = 1,r = q;
			int id = (l + r) >> 1;
			while(l <= r){
				ll mid = (l + r) >> 1;
				if(c[mid] <= a[i]){
					l =  mid + 1,id = mid;
				}else r = mid - 1;
			}
			res = min(res,mul(a[i] - b[pos]) + mul(b[pos] - c[id]) + mul(c[id] - a[i]));
		}
	}
	return res;
}
void solved(){
	int t;cin>>t;
	while(t--){
		int r,g,B;cin>>r>>g>>B;
		for(int i = 1; i <= r; i++)cin>>a[i];
		for(int i = 1; i <= g; i++)cin>>b[i];
		for(int i = 1; i <= B; i++)cin>>c[i];
		sort(a + 1, a + 1 + r);
		sort(b + 1, b + 1 + g);
		sort(c + 1, c + 1 + B);
		ll ans = 5e18;
		a[r + 1] = inf,b[g + 1] = inf,c[B + 1] = inf;
		ans = min(ans,cal(a,b,c,r,g,B));
		ans = min(ans,cal(a,c,b,r,B,g)); 
		ans = min(ans,cal(b,a,c,g,r,B));
		ans = min(ans,cal(b,c,a,g,B,r));
		ans = min(ans,cal(c,a,b,B,r,g));
		ans = min(ans,cal(c,b,a,B,g,r));;
		cout<<ans<<endl;
	}
}
int main(){
	solved();
	return 0;
}