首页 > 其他分享 >Codeforces 769B News About Credit 题解

Codeforces 769B News About Credit 题解

时间:2024-05-18 14:18:30浏览次数:19  
标签:pr About 769B int 题解 波利 卡普 fi define

题目简述

波利卡普在由 $n$ 名学生(包括他自己)组成的小组中学习,编号为 $1$ 到 $n$,波利卡普的编号始终是 $1$。他们都在社交网络上注册,每个学生都有一个值 $a_i$,表示第 $i$ 名学生每天能发送的最大信息数。

清晨,波利卡普知道了一个重要消息,他认为有必要通过私人消息紧急通知所有组员。

您的任务是制定一个使用私人信息的计划,以便使

  • 学生 $i$ 发送的信息数不超过 $a_i$。
  • 所有学生都知道重要消息(最初只有波利卡普知道)。
  • 学生只有在自己知道的情况下才能通知其他学生。

找到任意一种满足上述要求的使用私人消息的方法。

题目分析

如果一个同学要通知其他人,他一定会通知还能通知其他人且 $a_i$ 尽可能大的人,我们需要模拟上述贪心策略。

具体而言,我们可以先将 $2$ 到 $n$ 从大到小排序,枚举每一个 $i$,同时维护一个 $r$,表示 $1$ 到 $r$ 的人已经通知过了,每次使 $r \leftarrow r+a_i$,表示第 $i$ 个人通知第 $r+1$ 到 $r+a_i$ 的人。如果 $r \geq n$ 就结束。如果 $r<i$,那就说明前面的人不能通知到第 $i$ 个人,报告无解。用这种类似双指针的方法实现就可以了。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define random(a,b) (rand()%(b-a+1)+a)
#define se second
#define fi first
#define pr pair<int,int>
#define pb push_back
#define ph push
#define ft front
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,a,b) for(int i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof a)
const int N=201;
int n,r=1,cnt;
pr a[N],vis[N]; 
bool cmp(pr x,pr y)
{
	return x.fi>y.fi;
}
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    For(i,1,n)
    {
    	cin>>a[i].fi;
    	a[i].se=i;
	}
	sort(a+2,a+1+n,cmp);
	For(i,1,n)
	{
		if(r<i)
		{
			cout<<-1;
			return 0;
		}
		For(j,r+1,min(r+a[i].fi,n))
		{
			vis[++cnt]={a[i].se,a[j].se};
		}
		r+=a[i].fi;
		if(r>n) break;
	} 
	cout<<cnt<<"\n";
	For(i,1,cnt)
	{
		cout<<vis[i].fi<<" "<<vis[i].se<<"\n";
	}
	return 0;
}

标签:pr,About,769B,int,题解,波利,卡普,fi,define
From: https://www.cnblogs.com/zhuluoan/p/18199302

相关文章

  • 安装vue/cli报错问题解决
    在管理员终端中输入命令:npmi-g@vue/cli错误原因证书已过期,需要安装淘宝镜像npmconfigsetregistryhttps://registry.npmmirror.com使用cnpm安装脚手架报错cnpmi-g@vue/cli 这个错误表明你尝试执行的 cnpm 命令无法加载,因为PowerShell策略不允许执......
  • P10125 「Daily OI Round 3」Simple 题解
    题目传送门简单模拟,主要考察字符串。首先输入一个char类型的数组,然后直接遍历每一位是否为Acoipp或Svpoll即可。//Simple//codeby:cq_irritater//time:2024/02/04#include<bits/stdc++.h>usingnamespacestd;chara[10];intmain(){//freopen("......
  • P8684 [蓝桥杯 2019 省 B] 灵能传输 题解
    题目传送门本题涉及到了\(3\)种算法:前缀和,排序以及贪心。(1)前缀和本题实际上要求通过某种灵能传输可以使得该序列的最大值最小。而由前缀和可知,当某一个前缀和序列保持有序(或前缀和序列表示的函数单调)时,其\(s[i]-s[i-1]\)的最大值可以达到最小。通过对几个样例的观察......
  • P9686 Judg. 题解
    题目传送门一道简单模拟。这道题最简单的方法就是直接在for循环中判断题目给出状态是否为AC,如果不是则输出当前\(i\)的值,否则就不输出。#include<bits/stdc++.h>usingnamespacestd;constintMAXN=1e5+10;intn;stringa[MAXN];intmain(){ scanf("%......
  • P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    题目传送门试题A:空间【解析】本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能够算出答案。【程序】#include<bits/stdc++.h>usingnamespacestd;intmain(){printf("%d\n",256*8/32*1024*1024);return0;}【答案】67108864......
  • P8679 [蓝桥杯 2019 省 B] 填空问题 题解
    题目传送门试题A:组队【解析】本题是一道经典的DFS搜索题,每次对各号位的选手进行DFS,找到各号位上有成绩的选手时再进行进一步搜索即可。【程序】#include<bits/stdc++.h>usingnamespacestd;intteam[20][6];intmax_sum;boolvis[20];voiddfs(intu,intsu......
  • P9517 drink 题解
    题目传送门这道题考场上用的查找做的。先用一个结构体分别表示firstlast,然后进行查找即可,两个for循环分别计算出first和last,最后计算它们的差值。(注意,计算差值时要加1)然后你就会发现一个问题:只有\(90\)分。所以我们来思考一下哪里出现了问题。你会发现:如果全都是......
  • Codeforces 959B Mahmoud and Ehab and the message 题解
    题目简述小A想要给他的朋友小B发送了一条有$m$个单词的消息。他们的语言由编号从$a_1$到$a_n$的$n$个单词组成。一些单词具有相同的意思,因此存在$k$个单词组,其中每个组中的所有单词具有相同的意思。小A知道第$i$个单词可以以成本$m_i$发送。对于他的每个消息......
  • Codeforces 1113B Sasha and Magnetic Machines 题解
    题目简述有一个长度为$n$的正整数序列。你可以对这个数列进行最多$1$次的如下操作:选择两个数$i$和$j$,其中$1\leqi,j\leqn$并且$i\neqj$,并选择一个可以整除$a_i$的正整数$x$,然后将$a_i$变为$\frac{a_i}{x}$,将$a_j$变为$a_j\cdotx$。问你操作后,该序......
  • Codeforces 1037C Equalize 题解
    题目描述给定两个长度为$n$的$01$序列$a,b$。每次可以执行如下操作:在$a$中选择一个位置$p$,将$a_p$变为$1-a_p$,代价是$1$。在$a$中选择两个位置$p,q$,将$a_p$和$a_q$互换,代价是$\lvertq-p\rvert$。问最少需要多少代价才能将$a$变成$b$。题目分析......