Codeforces Round 906 (Div. 2)(D)(贪心思维)

1890D - Doremy's Connecting Plan 

        题意:给定两个数字 n 、c和一个长度为n的数组 a,现有n个孤立点,第 i 个孤立点的权值为a_{i},现需要通过建边将所有点全部连通。在第 i 个点和第 j 个点建边需要满足条件:\sum a_{k} \geq i * j *c(k\in S)(S为 i 所在连通块的点和 j 所在连通块的点的集合)。判断能否建成连通图。

        思路 : 观察式子右边,发现 i * j 越小容易建边,因此考虑能否和第1个点进行建边。当无法和第一个点建边时,则表示a_{1} + a_{j} < j * c , 放缩可得a_{j} < j * c , 那么考虑跟其他点建立边时必然有a{i} + a{j} < (i + j) * c < i * j * c。因此当无法和点1建边时,必然无法和其他点建边。由此可得:我们只需要每次都和第一个点所在连通块建边即可。那么建边条件弱化为:\sum a_{k} + a_{j} >= j * c(k\in S)(其中s为第一个点所在连通块的集合)。转移后得到:\sum a_{k} >= j * c - a_{j}(k\in S)。 于是右边的式子我们就可以进行预处理了,然后对右边的值贪心一波即可。

        

// Problem: D. Doremy's Connecting Plan
// Contest: Codeforces - Codeforces Round 906 (Div. 2)
// URL: https://codeforces.com/contest/1890/problem/D
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define x first
#define y second 
#define endl '\n'
const LL maxn = 4e05+7;
const LL N=2e05+10;
const LL mod=1e09+7;
typedef pair<int,int>pl;
priority_queue<LL , vector<LL>, greater<LL> >t;
priority_queue<LL> q;
LL gcd(LL a, LL b){
	return b > 0 ? gcd(b , a % b) : a;
}

LL lcm(LL a , LL b){
	return a / gcd(a , b) * b;
}
struct Node{
	LL num = 0;
	LL res = 0;
};
int cmp(Node a , Node b){
	return a.res > b.res;
}
void solve() 
{
	LL n , c;
	cin>>n>>c;
	Node a[n + 5];
	int vis[n + 5];
	memset(vis , 0 , sizeof vis);
	for(int i = 1; i <= n ; i++){
		cin>>a[i].num;
	}
	for(int i = 2 ; i <= n ; i ++){
		a[i].res = a[i].num - i * c;	
	}
	sort(a + 2 , a + n + 1 , cmp);
	for(int i = 2 ; i <= n ; i ++){
		if(a[1].num + a[i].res >= 0){
			a[1].num += a[i].num;
		}
		else{
			cout<<"NO\n";
			return;
		}
	}
	cout<<"YES\n";
}            
int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cout.precision(10);
    int t=1;
	cin>>t;
    while(t--)
    {
    	solve();
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spyder是一种常用的Python集成开发环境(IDE),用于开发和调试Python程序。当Spyder显示"Connecting to kernel"时,意味着Spyder正在尝试与Python内核建立连接。 Spyder连接到Python内核是为了能够运行和调试Python代码。内核是一个独立于Spyder的进程,负责解析和执行Python代码,并将结果返回给Spyder以供显示和处理。 当Spyder启动时,它会尝试启动一个Python内核。连接成功后,Spyder将显示"Connected",并且可以执行和调试代码。然而,有时由于网络问题、Python环境配置问题或其他原因,Spyder可能无法成功连接到内核,导致显示"Connecting to kernel"。 如果Spyder一直显示"Connecting to kernel",可以尝试以下几种解决方法: 1. 检查网络连接:确保你的计算机与互联网连接正常,尝试重启电脑或更换网络连接。 2. 检查Python环境:确保你已经正确安装和配置了Python环境。可以尝试重新安装Python并确保安装路径正确。 3. 更新Spyder和内核:升级到最新版本的Spyder和Python内核,以确保与最新的软件版本兼容。 4. 重启Spyder和内核:关闭Spyder并重启它,然后再次尝试连接内核。如果问题仍然存在,可以尝试重启计算机。 总之,"Connecting to kernel"表示Spyder正在尝试连接Python内核。如果遇到这个问题,需要检查网络连接、Python环境配置和软件版本,并采取相应的措施来解决连接问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值