CF1624C Division by Two and Permutation

news/2024/11/17 12:48:48/

原题链接

题意

t 组数据

每组给一个长度为 n 的序列 a . 可以对序列中的每个数做除以 2 操作(向下取整),问这个序列能否通过这种操作变成一个 1 - n 的排列。

思路

赛时有想到优先给能凑到的数个数少的数先凑,然后有一个错误思路是如果一个数本身就再 1- n 内那么就不动它…… 然后自以为学了点 stl ,就一顿乱写,结果是一个半小时都没弄出来。。。

正确思路是:通过枚举发现越大的数能凑到的数越少,因为每个数都可以凑到 1,越往上就越少。然后对于每个数,首先先使它除到小于等于 n ,然后再使它能凑除当前没有被凑出的且最大的数,然后就标记一下就可以了,然后还要注意边界条件,除以 2 时要大于 0 ,否则会死循环。

代码

#include <bits/stdc++.h> 
using namespace std;
int main()
{int t;cin >> t;while (t -- ){int n;cin >> n;int a[n + 10];for (int i = 1; i <= n ; i ++ ){cin >> a[i];}bool st[n + 10] = {0};//因为越大的数可以凑出的数就越少,所以尽量先凑出大的数,然后再往小的看 for (int i = 1; i <= n; i ++ ){int x = a[i];while (x > n) x /= 2;while (st[x] && x > 0) x /= 2;st[x] = 1;}int f = 1;for (int i= 1; i <= n; i ++ ) {if (!st[i]){cout  << "NO" << endl;f = 0;break;}}if (f) cout << "YES" << endl;}return 0;
}

赛时乱七八糟的代码

//#include<bits/stdc++.h>
//using namespace std;
//const int N = 55;
int a[N];
//int main()
//{
//	int t; cin >> t;
//	while (t -- )
//	{
//		int n;
//		scanf("%d", &n);
//		map<int, int> st;
//		vector<int> a;
//		bool res = 0;
//	
//		for (int i = 1; i <= n; i ++ ) 
//		{
//			int x;
//			scanf("%d", &x);
//			if (x > n)
//			{
//				a.push_back(x);
//			}
//		
//			if (x <= n && st[x] == 1) 
//			{
//				res = 1;
//			}
//		
//			if (x <= n)
//			{
//				st[x] = 1;
//			}
//		}
//		if (res)
//		{
//			cout << "NO" << endl;
//			continue;
//		}
//		sort(a.begin(), a.end());
//		for (int i = 1; i <= n; i ++ )
//		{
//			if (!st[i])
//			{
//				int x = a[0];
//				while (1)
//				{
//					if (x == i)
//					{
//						a.erase(a.begin());
//						break;
//					}
//					if (x == 0)
//					{
//						res = 1;
//						break;
//					}
//					x /= 2;
//				}
//			}
//			if (res) break;
//		}
//		if (res) cout << "NO" << endl;
//		else cout << "YES" << endl;
//	}
//	return 0;
//}
#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<int, int> a, pair<int, int> b)
{
	return a.second < b.second;
}
int main()
{
	int T;
	cin >> T;
	while (T -- )
	{
		int n;
		cin >> n;
		vector<int> a[55];
		map<int, int> f;
		map<int, int> num;
		pair<int, int> p[n + 10];
		int cnt = 0;
		for (int i = 1; i <= n; i ++ )
		{
			int x;
			cin >> x;
			int xx = x;
			num[x] ++;
			while (x > 0)
			{
				f[xx] ++;
				a[x].push_back(xx);
//				cout << x << " ";
				x /= 2;
			}
//			cout << endl;
		}
	
		map<int, int> stt;
		for (int i = 1; i <= n; i ++ )
		{
			p[i] = {i, f[i]};
		}
		sort(p + 1, p + 1 + n, cmp);
	
		bool ans = 0;
	
//		for (int i = 1; i <= n; i ++ ) cout << p[i].first << " " << p[i].second << endl;
	
//		for (int i = 1; i <= n; i ++ )
//		{
//			cout << i << " ::  ";
//			for (int j = 0; j < a[i].size(); j ++ )
//			{
//				cout << a[i][j] << " ";
//			}
//			cout << endl;
//		}
	
		for (int i = 1; i <= n; i ++ )
		{
			auto t = p[i];
		
//			if (f[t.first] == 0) //没有数可以凑成 
//			{
//				ans = 1;
//				break;
//			}
			bool ff = 0; //看有没有数可以用
		
			//尽量从小往大选 
//			sort(a[t.first].begin(), a[t.first].end());
			for (int j = 0; j < a[t.first].size(); j ++ )
			{
				//如果剩余个数大于0 
				if (num[a[t.first][j]] > 0)
				{
//					cout <<  a[t.first][j] << endl;
					num[a[t.first][j]] -- ;
					ff = 1;
					break;
				}
			}
			if (!ff)
			{
				ans = 1;
				break;
			}
		}
//		for (int i = 1; i <= n; i ++ )
//		{
//			cout << p[i].first << " " << p[i].second << endl;
//			if (p[i].second == 0)
//			{
//				ans = 1;
//				break;
//			}
//		
//			bool ff = 0;
//			for (int j = 0; j < a.size(); j ++ )
//			{
//				int x = a[j];
//				while (1)
//				{
//					if (x == i)
//					{
//						a.erase(a.begin() + j);
//						ff = 1;
//						break;
//					}
//					if (x == 0) break;
//					x /= 2;
//				}
//				if (ff) break;
//			
//			}
//			if (!ff) 
//			{
//				ans = 1;
//				break;
//			}
//		}
		if (ans ) cout << "NO" << endl;
		else cout << "YES" << endl;
	}
	return 0;
} 

//#include<bits/stdc++.h>
//using namespace std;
//const int N = 55;
int a[N];
//int main()
//{
//	int t; cin >> t;
//	while (t -- )
//	{
//		int n;
//		scanf("%d", &n);
//		map<int, int> st;
//		vector<int> a;
//		bool res = 0;
//	
//		for (int i = 1; i <= n; i ++ ) 
//		{
//			int x;
//			scanf("%d", &x);
//			if (x > n)
//			{
//				a.push_back(x);
//			}
//		
//			if (x <= n && st[x] == 1) 
//			{
//				res = 1;
//			}
//		
//			if (x <= n)
//			{
//				st[x] = 1;
//			}
//		}
//		if (res)
//		{
//			cout << "NO" << endl;
//			continue;
//		}
//		sort(a.begin(), a.end());
//		for (int i = 1; i <= n; i ++ )
//		{
//			if (!st[i])
//			{
//				int x = a[0];
//				while (1)
//				{
//					if (x == i)
//					{
//						a.erase(a.begin());
//						break;
//					}
//					if (x == 0)
//					{
//						res = 1;
//						break;
//					}
//					x /= 2;
//				}
//			}
//			if (res) break;
//		}
//		if (res) cout << "NO" << endl;
//		else cout << "YES" << endl;
//	}
//	return 0;
//}
//#include<bits/stdc++.h>
//#define int long long
//using namespace std;
//
//bool cmp(pair<int, int> a, pair<int, int> b)
//{
//	return a.second < b.second;
//}
//signed main()
//{
//	int T;
//	cin >> T;
//	while (T -- )
//	{
//		int n;
//		cin >> n;
//	
//		map<int, int> f;
//		map<int, int> num;
//		pair<int, int> p[n + 10];
//		int cnt = 0;
//		vector<int> a[10000008];
//		for (int i = 1; i <= n; i ++ )
//		{
//			int x;
//			cin >> x;
//			if (num[x] == 0) a[x].clear();
//			int xx = x;
//			num[x] ++;
//			while (x > 0)
//			{
//				f[x] ++;
//				a[x].push_back(xx);
				cout << x << " ";
//				x /= 2;
//			}
			cout << endl;
//		}
//	
//		map<int, int> stt;
//		for (int i = 1; i <= n; i ++ )
//		{
//			p[i] = {i, f[i]};
//		}
//		sort(p + 1, p + 1 + n, cmp);
//	
//		bool ans = 0;
//	
//		for (int i = 1; i <= n; i ++ ) 
//		{
			cout << p[i].first << " " << p[i].second << endl;
//			sort(a[i].begin(), a[i].end());
//		}
//	
		for (int i = 1; i <= n; i ++ )
		{
//			cout << i << " ::  ";
			for (int j = 0; j < a[i].size(); j ++ )
			{
				cout << a[i][j] << " ";
			}
			cout << endl;
		}
//	
//		for (int i = 1; i <= n; i ++ )
//		{
//			auto t = p[i];
//
//			bool ff = 0;
			cout << t.first<< "  :::   ";
//			for (int j = 0; j < a[t.first].size(); j ++ )
//			{
//				if (num[a[t.first][j]] > 0)
//				{
					cout << num[a[t.first][j]] << endl;
//					num[a[t.first][j]] -- ;
//					ff = 1;
//					break;
//				}
//			}
//			if (!ff)
//			{
//				ans = 1;
//				break;
//			}
//		}
//		if (ans ) cout << "NO" << endl;
//		else cout << "YES" << endl;
//	}
//	return 0;
//} 
#include<bits/stdc++.h>
using namespace std;
int main()
{int t; cin >> t;while (t -- ){int n;cin >> n;int a[n + 10];int k[n + 10];for (int i = 1; i <= n; i ++ ){cin >> a[i];}for (int )}return 0;
}

总结

我也不懂,这种题目,总是想不出来。


http://www.ppmy.cn/news/181822.html

相关文章

检测cpu是否支持VT

转载自http://hi.baidu.com/chenshake/item/4b372f4a70bfdb0be83504b6 最近研究云&#xff0c;一个前提基本就是是否支持VT&#xff0c;以前我以为外面的cpu&#xff0c;基本都支持&#xff0c;不过发现不是。只是我的笔记本的cpu&#xff0c;不支持&#xff0c;去年才买的。 …

cf 682C

原题&#xff1a;点击打开链接 给你一棵树&#xff0c;1为该树的根只要有任意一条到i的路径是大于num[i]&#xff0c;就要将该点和该点子树删掉。 从1开始搜索路径&#xff0c;取一到任意点的最大路径&#xff0c;若最大路径大于num[i]&#xff0c;则可以将该点与子树删除。当…

CF - 44C - Holidays

题意&#xff1a;n天假&#xff0c;安排m个人来浇花&#xff0c;第i个人负责[ai, bi]天&#xff0c;问花是否可以每天都被浇水且不重复&#xff0c;可以的话输出“OK”&#xff0c;不可以的话输出最早出问题的那天的天号以及那天花被浇了多少次水(1 ≤ n, m ≤ 100&#x…

ubuntu 安装python 3.2

rootnagat-Presario-CQ42-Notebook-PC:/# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 11.10 Release: 11.10 Codename: oneiric lz ubuntu版本11.10&#xff0c;自带pyython 2.7 1&#xff0e;下载python 3.2 打…

CF 2023/4/3

Army 伯兰德武装部队系统由 n 个军衔组成&#xff0c;这些军衔使用从 1 到 n 的自然数编号&#xff0c;其中 1 是最低军衔&#xff0c; n 是最高军衔。 一个人需要的正是d我年从排名 I 上升到排名 I 1。达到某个等级 i 没有达到之前的所有 i - 1 等级是不可能的。 瓦夏刚刚达到…

CF 2023/4/8

目录 Word Haiku Panoramixs Prediction Chips&#xff08;思维&#xff09; Word 瓦夏对网络上的许多人在一个单词中混合大写和小写字母感到非常沮丧。这就是为什么他决定为他最喜欢的浏览器发明一个扩展程序&#xff0c;该扩展程序将更改每个单词中的字母寄存器&#xff0…

CF 2023/4/2

Flag 根据新的ISO标准&#xff0c;每个国家的国旗都应该有一个n米的方格字段&#xff0c;每个正方形应该是10种颜色之一&#xff0c;国旗应该是“条纹”的&#xff1a;国旗的每个水平行应该包含相同颜色的正方形&#xff0c;相邻水平行的颜色应该不同。伯兰政府要求您了解他们的…

CF--1624C.Division by Two and Permutation

You are given an array aa consisting of nn positive integers. You can perform operations on it. In one operation you can replace any element of the array a_iai​ with \lfloor \frac{a_i}{2} \rfloor⌊2ai​​⌋, that is, by an integer part of dividing a_iai​…