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;
}