首页 > 其他分享 >ABC362

ABC362

时间:2024-07-19 20:40:01浏览次数:16  
标签:200005 int ed double ABC362 main ds

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

标签:200005,int,ed,double,ABC362,main,ds
From: https://www.cnblogs.com/wmmdbk/p/18312330

相关文章

  • 牛客小白月赛98+ABC362补题
    A-骰子魔术_牛客小白月赛98(nowcoder.com)直接判断这个数在数组里有没有就行代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;lln,x;lla[505];voidsolve(){for(inti=1;i<=n;i++)cin>>a[i];for(inti=1;i<=n;i++){......
  • [ABC362E]Count Arithmetic Subsequences
    题目大意给定\(N\)个数字的序列,每个元素为\(a[i]\),问长度为i的数字序列是由多少个子序列构成的?定义数字序列:如果\(a[i]-a[j]==a[k]-a[i]\),则\(a[j],a[i],a[k]\)构成数字序列数据范围\(N\leq80,a_i\leq10^9\)题解一看到这个数据范围,就和\(a[i]\)没关系,肯定是和\(N\)有......
  • [ABC362C]Sum = 0
    题目大意给定\(N\)个区间,每个区间有左端点和右端点,问从每个区间选择一个数字,使得这些数字加起来为0,如果能,输出“Yes”,并且输出这些数字,否则输出“No”,题解这个题如果只是输出Yes或者No,我们将所有的左端点加起来,所有的右端点加起来,这就是所有数的范围,如果这个范围内有0,则是Yes,否......
  • 2024/7/13 ABC362 比赛记录
    7/14:昨晚打的abc,外面下着大雨;1650ptsrank975T1:简单签到题,愣是被我拖了7min死因:开赛时老师开始收手机,一直叫我名,我一着急装了两个翻译插件,导致页面错版。时间宝贵,于是我艰难的对照样例勉强读懂题(T2:计算几何?给平面直角坐标系3点,判rt三角形。直接double勾股定理算边......
  • 题解:AT_abc362_d [ABC362D] Shortest Path 3
    一句话题意:给定一个带点权的有权无向连通图,求点1到所有其它点的最短路径。首先,只有1一个起点,所以是单源最短路,又因为最大是\(2\times10^5\),所以是优先队列(堆)优化过后的Dijkstra。所以,我们只需要解决点权的问题就好了。一种显而易见的想法是把与这条边的边权加上起终点......
  • 题解:AT_abc362_c [ABC362C] Sum = 0
    很好写(15min解决)但不好讲(跟别人讲了20min)的写法QwQ……首先,咱先算出原式的范围。最小值(暂且记为\(k\))的公式就是:\[k=\sum_{i=1}^{N}L_i\]就是每一个最小可能值的和。同理,最大值(我记为\(w\))的公式就是:\[w=\sum_{i=1}^{N}R_i\]即最大可能值的和。算这玩意儿......