首页 > 其他分享 >CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!) D. Tenzing and His Animal Friends

CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!) D. Tenzing and His Animal Friends

时间:2023-06-28 11:55:39浏览次数:30  
标签:cnt Rated Tenzing temp int ll 集合 Div include

题面是真的抽象,翻译为人话之后大概就是,对于每个选择的集合当中,1必须选,n一定不能选,每个限制条件的意思是如果u和v不在一个集合里则最能玩y时间,则u或v独自玩最多玩y时间

如果在同一集合则可以玩无限时间

因此如果n和1不连通的话则一定为inf,否则的话就一定有限制,因为n一定不能选,则和n相连的必定受限制,因此这些限制一直传递,如果传不到1则可以无限玩

转换之后就是一个最短路问题,求n到i的最短路,最后d[1]就是能玩的最大时间限制

因为根据贪心的思想可得,我们让所有有限制的动物处于同一集合当中这样就可以解除限制,但是由于n一定不在集合中,因此集合当中玩的最大时间实际上就是和n的限制的最小数,不能超过这个限制,例如3->2->5,如果1,3,2一起玩的话则最多玩1分钟,1,3,2实际上是受2的限制,1,3一起玩的话本来最多玩2分钟但是因为之前3已经玩了1分钟因此也是1分钟,此时受3的限制

每次迭代,先求出当前集合里的最小时间,则目前这个集合最多能玩的就是这个时间,然后这个集合里面所有等于最小时间的都不能继续玩了,即被淘汰了

 

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <set>
#include <utility>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
const int N=110;
const ll INF=1e18+20;
ll d[N];//记录n到i的最短路
int a[N][N];
bool st[N];
int n,m;
vector<string> s;
vector<ll> min_res;
void dijstra(){
	d[n]=0;
	for(int i=0;i<n-1;i++){
		int t=-1;
		for(int j=1;j<=n;j++)
		if(!st[j]&&(t==-1||d[t]>d[j]))
		t=j;
		st[t]=true;
		for(int j=1;j<=n;j++){
			if(a[t][j]!=0x3f3f3f3f)//如果t和j不连通的话就不更新
			d[j]=min(d[j],d[t]+a[t][j]);
		}
	}
}
ll get_min(){
	ll cnt=INF;
	for(int i=1;i<=n;i++){
		if(d[i]>0)//求的是还可以一起玩的
		cnt=min(cnt,d[i]);
	}
	return cnt;
} 
void solve(){
	cin>>n>>m;
	memset(a,0x3f,sizeof a);
	memset(st,0,sizeof st);
	for(int i=1;i<=n;i++) d[i]=INF;
	while(m--){
		int x,y,z;
		cin>>x>>y>>z;
		a[x][y]=a[y][x]=min(a[x][y],z);
	}
	dijstra();
	if(d[1]==INF){//如果1和n不连通的话就可以无限玩
		puts("inf");
		return;
	}
	ll res=d[1];
	string temp;
	while(d[1]>0){
		ll cnt=get_min();//求出现在集合当中的最小值,从1开始求
		temp.clear();
		min_res.push_back(cnt);
		for(int i=1;i<=n;i++){
			if(d[i]>0){//集合里面每个数字都减去该最小值得到还可以玩的时间
				d[i]-=cnt;
				temp+='1';
			}
			else{
				temp+='0';
			}
		}
		s.push_back(temp);
	}
	cout<<res<<" "<<s.size()<<endl;
	for(int i=0;i<s.size();i++){
		cout<<s[i]<<" "<<min_res[i]<<endl;
	}
} 
int main(){
		solve();
}

 

标签:cnt,Rated,Tenzing,temp,int,ll,集合,Div,include
From: https://www.cnblogs.com/liyiyang/p/17511008.html

相关文章

  • Codeforces Round 881 (Div. 3)
    失踪人口回归VP打的A.SashaandArrayColoringintn;inta[maxN];voidsolve(){ n=rd(); fp(i,1,n)a[i]=rd(); sort(a+1,a+n+1); llans=0; for(inti=1;i*2<=n;++i) ans+=(a[n-i+1]-a[i]); cout<<ans<<endl;}B.LongLongintn;inta[maxN......
  • 【CF1842F】Tenzing and Tree
    题目题目链接:https://codeforces.com/contest/1842/problem/F给定一棵\(n\)个点的树,你可以选择其中\(k\)个点染黑,定义一条边的价值为割去这条边之后,剩下两颗树的黑点数量差;一棵树的价值为所有边的价值之和。对于\(k\in[0,n]\),求出树的价值的最大值。\(n\leq5000\)。思......
  • maltab 利用不同方式(自编高斯赛德尔迭代函数,逆矩阵,左除(\)运算)求解线性方程组的速度
    参考:matlabhelp文档:mldivide实际测试比较,这里K_Tem为一个2398*2398的稀疏矩阵,Guass_Seidal是自己写的高斯赛德尔迭代函数 ......
  • CF1834 Div.2 做题记录
    A题面分类讨论即可点击查看代码#include<bits/stdc++.h>#defineullunsignedlonglong#definelllonglong#definepiipair<int,int>#definepdipair<double,int>#definepbpush_back#defineeps1e-9#definempmake_pairusingnamespacestd;namesp......
  • [LeetCode] 1071. Greatest Common Divisor of Strings
    Fortwostrings s and t,wesay"t divides s"ifandonlyif s=t+...+t (i.e., t isconcatenatedwithitselfoneormoretimes).Giventwostrings str1 and str2,return thelargeststring x suchthat x dividesboth str1 and str2.Exam......
  • CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!) C. Tenzing and Balls
    一开始以为是贪心,后来发现不好贪于是选择了dp,但是dp有个小细节没注意到,后面wa了几发我们以状态来分,f[i]表示考虑i的最大区间合长度,每次转移的时候考虑两种情况,一种是a[i]前面有一样的数字,比较选了a[i]和不选a[i]两种情况下的最大值,还有一种就是a[i]为第一个出现的数字则选区间长......
  • CF Round 881 (Div. 3)
    CFRound881(Div.3)Div.3果然简单,虽然但是,我还是有1道题没有想出来。A.SashaandArrayColoring排序双指针向内即可。https://codeforces.com/contest/1843/submission/210855587B.LongLong好啊,就是这道题没想出来。VirtualContest上完成了一半。考虑把符......
  • Educational Codeforces Round 150 (Rated for Div. 2) A-E
    比赛链接A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;boolsolve(){intn;cin>>n;if(n<=4)cout<<"Bob"<<'\n';elsecout<<"Alice"<<......
  • CodeForces 1842E Tenzing and Triangle
    洛谷传送门CF传送门一个很显然的观察:选择的三角形两两重叠面积为\(0\),否则合并更优。考虑dp,设\(f_i\)为删完\(x_j\gei\)的所有点的最小花费。转移就枚举选择的三角形直角边长\(l\),那么\(f_i=\min(f_{i+1}+\sum\limits_{x_p=i}c_p,\min\limits_lf_{i+l}......
  • CodeForces 1842G Tenzing and Random Operations
    洛谷传送门CF传送门原来还不会这种拆期望的套路设\(b_j\)为第\(j\)次操作中选择的\(i\),所求即为\(E(\prod\limits_{i=1}^n(a_i+\sum\limits_{j=1}^m[b_j\lei]\timesv))\)。乘法也可以考虑拆期望。我们有最基础的性质\(E((a+b)\times(c+d))=E(ac)......