ABC362

学贵坚持發表於2024-07-19

A

link

判斷即可。。。

點選檢視程式碼
#include<bits/stdc++.h>

using namespace std;

int r,g,b;
string c;

signed main(){
	
	cin >> r >> g >> b >> c;
	if(c == "Red") cout << min(g,b);
	else if(c == "Blue") cout << min(r,g);
	else cout << min(r,b);
	
	return 0;
	
} 

B

link

根據距離公式算三邊距離,再根據勾股定理計算是否為\(RT△\)
注意\(double\)型不能直接判斷相等,要判斷差的絕對值小於某一個很小的數。

點選檢視程式碼
#include<bits/stdc++.h>

using namespace std;

int xa,ya,xb,yb,xc,yc;

double dis(int x,int y,int l,int r){
	return sqrt(1.0*(x-l)*(x-l)+1.0*(y-r)*(y-r));
}

signed main(){
	
	cin >> xa >> ya >> xb >> yb >> xc >> yc;
	double a[3] = {dis(xa,ya,xb,yb),
	dis(xa,ya,xc,yc),dis(xb,yb,xc,yc)};
	
	sort(a,a+3);
	double t = a[0]*a[0]+a[1]*a[1];
	double tt = a[2]*a[2];
	if(abs(t-tt) < 1e-6) cout << "Yes";
	else cout << "No";
	
	return 0;
	
}

C

link

首先,判斷一下是否可能:把所有的\(l_i\)\(r_i\)分別相加,得到兩個數\(R\)\(L\)
如果\(L\)\(R\)包括\(0\)即有解。因為所有數之和最小為\(L\),最大為\(R\),所以\(L\)\(R\)包括\(0\)即有解。
那麼怎麼求解呢?
我們先讓所有的\(a_i\)等於\(l_i\),這時所有數的和小於\(0\)。接下來,我們從\(1\)開始遍歷,如果當前所有數的和仍不是\(0\)(小於\(0\)),則讓\(a_i\)變大,如果可以變到\(r_i\)則變到\(r_i\),否則變大當前所有數的和與\(0\)的差。

點選檢視程式碼
#include<bits/stdc++.h>

#define int long long

using namespace std;

int n,suml,sumr;
int l[200005],r[200005];
int a[200005];

signed main(){
	
	cin >> n;
	
	for(int i = 1;i <= n;++ i){
		cin >> l[i] >> r[i];
		suml += l[i];
		sumr += r[i];
		a[i] = l[i];
	}
	
	if(suml <= 0&&sumr >= 0) cout << "Yes\n";
	else{
		cout << "No";
		return 0;
	}
	
	int tmp = -1*suml;
	
	for(int i = 1;i <= n;++ i){
		if(tmp > r[i]-l[i]){
			a[i] = r[i];
			tmp -= r[i]-l[i];
		}
		else{
			a[i] += tmp;
			break;
		}
	}
	
	for(int i = 1;i <= n;++ i)
		cout << a[i] << " ";
	
	return 0;
	
}

D

link

這個題就是最短路。
對於一條邊,將終點的點權加到邊權裡去,跑最短路即可,最後把起點的點權加上。

點選檢視程式碼
#include<bits/stdc++.h>

#define pii pair<int,int>
#define int long long

using namespace std;

int n,m;
int a[200005];
vector<pair<int,int> > ed[200005];
int ds[200005];
const int inf = 1e18;
bool vs[200005];

void dijkstra(int s){
	for(int i = 1;i <= n;++ i)
		ds[i] = inf;
	ds[s] = a[s];
	priority_queue<pii,vector<pii>,greater<pii> >q;
	q.push({ds[s],s});
	while(!q.empty()){
		int t = q.top().second;q.pop();
		if(vs[t]) continue;
		vs[t] = 1;
		for(int i = 0;i < ed[t].size();++ i){
			int j = ed[t][i].first,
			w = ed[t][i].second;
			if(ds[j] > ds[t]+w){
				ds[j] = ds[t]+w;
				q.push({ds[j],j});
			}
		}
	}
}

signed main(){
	
	cin >> n >> m;
	for(int i = 1;i <= n;++ i)
		cin >> a[i];
	for(int i = 1;i <= m;++ i){
		int u,v,w;
		cin >> u >> v >> w;
		ed[u].push_back({v,w+a[v]});
		ed[v].push_back({u,w+a[u]});
	}
	
	dijkstra(1);
	
	for(int i = 2;i <= n;++ i)
		cout << ds[i] << " "; 
	 
	return 0;
	
}