首页 > 其他分享 >[Codeforces] CF1799B Equalize by Divide

[Codeforces] CF1799B Equalize by Divide

时间:2023-11-26 17:12:36浏览次数:30  
标签:blue color Codeforces 测试数据 leq red Equalize CF1799B first

序列操作(divide.cpp)—CF1799B—1200

题目描述

给您一个 \(a_1,a_2,\dots a_n\) 这样的正整数数组,您可以对它进行多次(可以是零次)这样的操作:

  • 选择两个索引 \(i,j(1 \leq i,j \leq n,i \neq j)\);
  • 将 \(a_i\) 赋值为 \(\lceil \frac{a_i}{a_j}\rceil\)。这里的 \(\lceil x \rceil\) 表示将 \(x\) 取值到最小的大于等于 \(x\) 的整数上。

有可能将通过这样的操作使数组的所有元素相等吗(或许为空)?如果可以,打印任何一种操作次数小于等于 \(30n\) 的操作方法。

可以证明,在问题约束下,如果存在让数组所有元素相等的操作方法,那么操作次数最多 \(30n\) 次。

输入格式

第一行仅一个正整数 \(t(1 \leq t \leq 1000)\),表示测试数据的组数。对于测试数据的描述如下。

每一组测试数据的第一行都仅一个正整数 \(n(1 \leq n \leq 100)\)。

每一组测试数据的第二行都有 \(n\) 个正整数 \(a_1,a_2,\dots,a_n(1 \leq a_i \leq 10^9)\)。

保证所有测试数据的 \(n\) 之和不超过 \(1000\)。

输出格式

对于每一组测试数据,先输出一个整数 \(q(-1 \leq q \leq 30n)\)。如果 \(q=-1\),表示问题无解,否则 \(q\) 表示达成目的所需的操作次数。

若 \(q \geq 0\),则接下来的 \(q\) 行每行两个正整数 \(i,j(1\leq i,j \leq n,i\neq j)\),表示每一次操作中的 \(i,j\)。

如果问题多解,输出其中任意一个即可。

样例 #1

样例输入 #1

10
1
100
3
1 1 1
2
2 1
2
5 5
3
4 3 2
4
3 3 4 4
2
2 100
5
5 3 6 7 8
6
3 3 80 3 8 3
4
19 40 19 55

样例输出 #1

0
0
-1
0
2
1 3
2 1
4
3 1
4 2
1 3
2 4
6
2 1
2 1
2 1
2 1
2 1
2 1
8
5 2
4 2
3 2
1 3
1 3
2 1
4 1
5 1
4
5 1
3 1
3 1
3 1
9
4 2
2 1
1 2
1 2
3 2
3 2
1 4
2 4
3 4

提示

对于前两个点,他们的每个数都已经完全相等,不需要做任何操作

对于第三个测试点,不可能将其变为相等的数

对于第五个测试点: $ [\color{red}{4}, 3, \color{blue}{2}] \to [\color{blue}{2}, \color{red}{3}, 2] \to [2, 2, 2] $ .

对于第六个测试点: $ [\color{blue}{3}, 3, \color{red}{4}, 4] \to [3, \color{blue}{3}, 2, \color{red}{4}] \to [\color{red}{3}, 3, \color{blue}{2}, 2] \to [2, \color{red}{3}, 2, \color{blue}{2}] \to [2, 2, 2, 2] $ .

红色的是每次选择的 $ i $ ,蓝色的是每次选择的 $ j $

题解

思路

可以发现,一旦序列中出现了\(1\),那么这个序列就无法继续被操作,所以序列中不能出现\(1\)

为了避免序列中出现\(1\),可以每次让序列中的最小值去除以序列中的其他任意值。可以证明,如此操作下来,序列一定能被清空

证明一下:

首先,任何数无限除以\(2\)上取整,最后一定会得到\(2\),所以只需要构造出一个\(2\)即可。

接着,我们可以发现,其实任意两个数反复进行如上的\(\lceil \frac{a_i}{a_j}\rceil\)操作时,最后的结果都会是\(2\),所以该操作是可行的

代码

#include<bits/stdc++.h>
using namespace std;
int run()
{
	int n,num1;num1=0;
	pair<int,int> a[110],minn;
	priority_queue<pair<int,int> >q;
	vector<pair<int,int> >ans;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].first;
		if(a[i].first==1) num1++;
		a[i].second=i;
	}
	if(num1)
	{
		cout<<0-(num1!=n)<<endl;
		return 0;
	}
	sort(a+1,a+n+1);minn=a[1];
	for(int i=1;i<=n;i++) q.push(a[i]);
	while(q.top().first!=minn.first)
	{
		pair<int,int> t=q.top();q.pop();
		if((t.first+minn.first-1)/minn.first!=1) t.first=ceil(t.first*1.0/minn.first);
		ans.push_back(make_pair(t.second,minn.second));
		if(t.first<minn.first) minn=t;
		q.push(t);
	}
	cout<<ans.size()<<endl;
	for(int i=0;i<ans.size();i++) cout<<ans[i].first<<" "<<ans[i].second<<endl;
}
int main()
{
//	freopen("test.in","r",stdin);
	int t;
	cin>>t;
	while(t--) run();
}

标签:blue,color,Codeforces,测试数据,leq,red,Equalize,CF1799B,first
From: https://www.cnblogs.com/lyk2010/p/17857555.html

相关文章

  • [Codeforces] CF1747C Swap Game
    游戏(game.cpp)—CF1747C—1200\(时间:1s\space|\space空间:250MB\)题面翻译Alice和Bob两个人在玩游戏。有一个长度为\(n\)的序列\(a\),Alice和Bob两人轮流完成一个操作,Alice先开始。每个人可以将数列的第一个数减\(1\),并将它与后面序列的一个数进行交换,如果一个......
  • Educational Codeforces Round 158 (Rated for Div. 2)
    EducationalCodeforcesRound158(RatedforDiv.2)基本情况A题很水,几分钟秒了。B题想到一个解,被自己hack掉之后没有重新想,一直想在自己一开始的基础上改好,结果最后B都没拿下。B.ChipandRibbon我的思路其实也是找规律,根本没严谨地证明正确性。不应该一条路走到黑的......
  • Educational Codeforces Round 158 补题(A~D)
    A.思路找出最大耗油的路程即可ac代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;consti64inf=8e18;typedefpair<int,int>pii;voidsolve(){intn,x;cin>>n>>x;std::vector<int>v(n);f......
  • Educational Codeforces Round 158 (Rated for Div. 2)
    A.LineTrip题意是:有n个加油点,人要来回两趟,问你最少要多少油?usingnamespacestd;inta[100];voidsolve(){ intn,m; cin>>n>>m; for(inti=1;i<=n;i++)cin>>a[i]; intans=a[1]; for(inti=2;i<=n;i++){ ans=max(ans,a[i]-a[i-1]); } ans=max(ans,2*(m-......
  • Educational Codeforces Round 146 补题(A~C)
    EducationalCodeforcesRound146(RatedforDiv.2)A.Coins题目大意给你两个整数n和k,问你是否存在两个非负整数x和y,使得2⋅x+k⋅y=n成立思路裴蜀定理秒了,记得开longlongac代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;consti64in......
  • Educational Codeforces Round 158 (Rated for Div. 2) A-C
    A大致题意:有一条长度为x的直线公路,最开始你位于0号点并且此时你的油箱装满了油,公路有n个加油站,当你经过加油站的时候你可以在加油站加满油,每走一个单位需要花费1升油量,起始位置和终点没有加油站,请问你的油箱容量至少为多少升才可以够你跑一个来回。解题思路:我们的路径大致是......
  • [Codeforces] CF1717C Madoka and Formal Statement
    时间限制\(1s\)|空间限制\(250M\)题目大意题目描述给定一个数列\(a_{1…n}\),如果满足下面条件,你可以使\(a_i=a_i+1\):\(i<n\)且\(a_i\leqa_{i+1}\)\(i=n\)且\(a_i\leqa_{1}\)再给定一个数列\(b_{1…n}\),问\(a\)是否可以通过上述操作变......
  • [Codeforces] CF1703F Yet Another Problem About Pairs Satisfying an Inequality
    时间限制\(2s\)|空间限制\(250M\)题目描述给你一个序列$a_1,a_2,\dotsa_n$。请计算出满足下面条件的$(i,j)(1\leqi,j\leqn)$个数。$a_i<i<a_j<j$.输入格式第一行包含一个整数$t$($1\leqt\leq1000$)—测试数据的个数每一个......
  • [Codeforces] CF1857D Strong Vertices
    StrongVertices-洛谷题解是个好东西题意给定两个数组 \(a\) 和 \(b\),对此构造一张有向图:若 \(a_u−a_v≥b_u−b_v\),则 \(u\) 向 \(v\) 连边。求所有向其他所有顶点连边的顶点个数,并按从小到大顺序输出它们。思路先对原式进行转换:\(a_u-b_u\geqa_v-b_v\)接着......
  • [Codeforces] CF1714E Add Modulo 10
    题目传送门代码一遍AC真的很爽,样例都是一遍过题意每个测试点含多组测试数据。对于每组测试数据第1行一个整数\(n\),表示该数据个数第2行\(n\)个整数,你需要判断是否符合题意的数据对每组数据,你可以对其作若干次(可以为零)如下操作:选取数据中的一个数\(a_i\)将其替换......