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