题意:给你三个区间,要你在这三个区间选三条边使得它成为一个三角形。
思路:签到题,直接输出一个等腰三角形,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;
}