cf思维专题3

C. Challenging Cliffs
将绝对值差最小的两个数,较小的放第一个,另一个最后一个
然后我们要尽量让这个数列递增的多
把 p+2 到 n 都放在 p 的后边,然后把 1 到 p -1放到 p+1前边
这样能保证只有 n 和 1的交界地没有递增

如何想到这样放置:它既然要求我们尽量递增的多,那么一开始sort一遍的结果就是递增的最多的。而我们需要移动两个元素到头和尾,我们要让这个序列整体变化最小,就只移动前一半和后一半

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 9;
const int inf = 0x3f3f3f3f;
int t = 1, n , x, m, k, y;
int a[N];
int main()
{
	cin >> t;
	while(t--)
	{
		cin >> n;
		for(int i = 1; i <= n; ++i)	scanf("%d", &a[i]);
		sort(a+1,a+1+n);
		int mi = 1e9, p = 0;
		for(int i = 1; i < n; ++i)
			if(a[i+1] - a[i] < mi) mi = a[i+1] - a[i], p = i;
		printf("%d ", a[p]);
		for(int i = p+2; i <= n; ++i) printf("%d ", a[i]);
		for(int i = 1; i < p; ++i) printf("%d ", a[i]);
		printf("%d\n", a[p+1]);
	}
	return 0;
}

B. Nastia and a Good Array
我们可以发现,最小的位置上的数绝对是构造完的数列中最小的那个数
由于__gcd(x, x + 1) == 1,所以我们可以利用此性质做n - 1次变换

思路1:由最小值所在的位置开始,向两侧各做一个递增的差值为1的等差数列
思路2:
假设最小数下标 k
把除最小的这个数以外的所有数,用 a[k] + (i + k) % 2 替换
%2 好理解,就是利用奇偶构造
至于 +k 就是因为 k 所在的位次的奇偶性会影响构造奇偶的顺序(先偶再奇或者先奇再偶)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 9;
ll a[N];
int n;
const int p = 99999989;
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		cin >> n;
		int k = 1;
		for(int i = 1; i <= n; ++i)
		{
			scanf("%d", &a[i]);
			if(a[i] < a[k]) k = i;
		}
		cout << n - 1 << endl;
		int c = 1, d = 0;
		if(k & 1) c = 0, d = 1;
		for(int i = 1; i <= n; ++i)
		{
			if(i != k) cout << i << " " << k << " " << a[k] + (i + k) % 2 << " " << a[k] << endl;
			// 或者手动校准奇偶
			//if(i != k) cout << i << " " << k << " " << a[k] + (i % 2 ? c : d) << " " << a[k] << endl;
		}
	}
	return 0;
}

other

#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+50;
int n,m,ans,T,a[maxn];
int main()
{
    scanf("%d",&T);
    for (int oo=1; oo<=T; ++oo)
    {
        scanf("%d",&n);
        for (int i=1; i<=n; ++i) scanf("%d",&a[i]);
        printf("%d\n",n/2);
        for (int i=1; i+1<=n; i+=2)
        {
            int t=min(a[i],a[i+1]);
            if (t>=998244353)
            {
                if (t==a[i-1]) ++t;
                printf("%d %d %d %d\n",i,i+1,t,t+1); a[i+1]=t+1;
            }
            else
            {
                printf("%d %d %d %d\n",i,i+1,t,998244353);
                a[i+1]=998244353;
            }
        }
    }
    return 0;
}


B. Prinzessin der Verurteilung
暴搜解法

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 2e5 + 9;
typedef long long ll;
const int mod = 1e9 + 7;
string s;
int n, l, f;
void dfs(string t, int len)
{
	if(f) return;
	if(len == l)
	{
		if(s.find(t) == -1){
			f = 1;s = t;
		}
		return;
	}
	for(int i = 0; i < 26; ++i)
	{
		dfs(t + char(i + 'a'), len+1);
	}
}
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		cin >> n >> s;
		f = 0;
		for(l = 1; l <= 26; ++l)
		{
			if(f) break;
			dfs("", 0);
		}
		cout << s << endl;
	}

	return 0;
}

A. Nastia and Nearly Good Numbers

构造题

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 9;

priority_queue <int> q;
ll t = 1, n, m, a[31], b[31], c[N], ans, x;

int main()
{
	cin >> t;
	while(t--)
	{
		scanf("%lld %lld", &n, &m);
		if(m == 1) cout << "NO\n";
		else
		{
			printf("YES\n%lld %lld %lld\n", n * (m - 1), n* (m + 1), n * m * 2);
		}
	}
	return 0;
}

B. Plus and Multiply
思维思维思维

#include<bits/stdc++.h>
#define endl '\n'
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const ll N = 1e3 + 9;
ll l, r, n, m, x, y, t;
ll a, b;
int main()
{
	cin >> t;
	while(t--)
	{
		scanf("%lld %lld %lld", &n, &a, &b);
		bool f = 0;
		ll x = 1;
		for(int i = 0; i <= 32 && x <= n; ++i)
		{
			if((n - x) % b == 0){
			f = 1;	
			printf("Yes\n");break;
			}
			x *= a;
		}
		if(!f) printf("No\n");
	}
	return 0;
}

B. Last minute enhancements
每次可以选择把一个数+1或者不变
5
2 2 3 4 5
由这个例子可以发现如果从后往前遍历,我们可以取得最大值,而从前往后我们无法确定什么时候选择 + 1

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 9;
const int inf = 0x3f3f3f3f;
int t, n, x;
int pos[N];
void slove() 
{
    scanf("%d", &n);
    for(int i = 1; i <= 2*n+1; ++i) pos[i] = 0;
    for(int i = 1; i <= n; ++i)	scanf("%d", &x), pos[x]++;
    int ans = 0;
	for(int i = 2 * n; i >= 1; --i)
    {
    	if(!pos[i]) continue;
    	if(pos[i] == 1)
    	{
    		if(!pos[i+1])
				pos[i] = 0, pos[i+1] = 1; 
			++ans;
		}
		else 
		{
			if(pos[i+1] == 0)
			{
				ans += 2; pos[i+1] = 1; pos[i]--;
			}
			else ++ans;
		}
		//cout << i << " "  << ans << endl;
	}
	cout << ans << endl;
}
int main() 
{
    scanf("%d", &t);
    while (t--) slove();
}

A. Colour the Flag
题意: 给你一个初始的矩阵,判断能否构成 W R 交错排列的矩阵
暴力思路:如果可以,那么只有两种结果, 第一个是 R 或者第一个是 W,直接构造一个 R 开始和 W 开始的矩阵,然后判断和初始矩阵是不是有冲突,两个都有冲突就输出 NO。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 59;
char ans1[N][N], ans2[N][N];
char a[N][N];
int t, n, m;
int main()
{
	cin >> t;
	while(t--)
	{
		memset(ans1,0,sizeof(ans1));
		memset(ans2,0,sizeof(ans2));
		scanf("%d %d", &n, &m);
		for(int i = 1; i <= n; ++i)
			for(int j = 1; j <= m; ++j)
				if(i & 1){
					if(j & 1) ans1[i][j] = 'R';
					else ans1[i][j] = 'W';
				}
				else {
					if(j & 1) ans1[i][j] = 'W';
					else ans1[i][j] = 'R';
				}
		for(int i = 1; i <= n; ++i)
			for(int j = 1; j <= m; ++j)
				if(i & 1){
					if(j & 1) ans2[i][j] = 'W';
					else ans2[i][j] = 'R';
				}
				else {
					if(j & 1) ans2[i][j] = 'R';
					else ans2
					[i][j] = 'W';
				}
		bool f1 = 1, f2 = 1;
		for(int i = 1; i <= n; ++i)	scanf("%s", a[i] + 1);
		for(int i = 1; i <= n; ++i)
			for(int j = 1; j <= m; ++j)
			{
				if(a[i][j] != '.' && a[i][j] != ans1[i][j]) f1 = 0;
				if(a[i][j] != '.' && a[i][j] != ans2[i][j]) f2 = 0;
			}
		if(!f1 && !f2) cout << "NO\n";
		else if(f1){
			cout << "YES\n";
		for(int i = 1; i <= n; ++i)
			printf("%s\n", ans1[i] + 1);
	}
		else if(f2){
			cout << "YES\n";
		for(int i = 1; i <= n; ++i)
			printf("%s\n", ans2[i] + 1);
	}
	}
	
	return 0;
}

B. Histogram Ugliness
注意初始化细节

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4e5 + 9; 
int n, t, _;
ll a[N];
ll ans = 0;
void work()
{
	ans = 0;
	scanf("%d", &n);
	a[n+1] = 0;
	// * 这个很重要,不然会wa  后边会比较到 n + 1 
	for(int i = 1; i <= n; ++i)
	{
		scanf("%lld", &a[i]);
		ans += abs(a[i] - a[i-1]);
	}
	ans += a[n];
	for(int i = 1; i <= n; ++i)
	{
		if(a[i] > a[i-1] && a[i] > a[i+1])
			ans -= a[i] - max(a[i-1], a[i+1]);
	}
	cout << ans << endl;
}
int main()
{
	cin >> t;
	for(_ = 1; _ <= t; ++_)
		work();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: h3cf100cg2是一款网络设备,一般来说,它的默认密码是由厂商提供的,用于设备的初始设置和登录。但是由于网络安全的原因,我不能直接告诉你默认密码是什么。这种做法是为了防止未经授权的访问和潜在的安全风险。如果您购买了h3cf100cg2设备,建议您查阅设备的用户手册或联系厂商获取正确的默认密码。在设备安装和设置时,强烈建议您修改默认密码,使用强密码来保护设备免受潜在的攻击。此外,确保设备的固件、软件和补丁都是最新的,以提高设备的安全性。在使用设备时,请时刻保持警惕,不要将设备密码泄露给他人,以防止未经授权的访问和数据泄漏。如有需要,您可以咨询网络安全专家或厂商获取更多关于设备安全的建议和推荐。 ### 回答2: h3cf100cg2是一款华三(H3C)公司推出的网络设备。关于默认密码,我们需要了解的是,通常情况下,网络设备的默认密码是为了方便用户初次使用和配置设备而设置的。 然而,我们无法提供具体的默认密码,因为默认密码会因为设备型号和固件版本的不同而有所变化。理论上,用户在获得设备后,通常可以在设备的产品说明书或者主页上找到默认密码的信息。另外,一些设备也会在初始启动时显示默认密码或要求用户进行设置。 建议使用者在设备配置之前,先查阅相关的设备手册或者联系供应商以获取准确的默认密码信息。此外,为了保证设备的安全性,一旦获得默认密码,用户应该及时修改默认密码,以防止未经授权的访问和潜在的安全威胁。 ### 回答3: h3cf100cg2是指华三(H3C)品牌的一种网络交换机型号,而默认密码是指出厂时为了方便用户设置而设定的初始密码。一般情况下,为了保障设备安全,厂商会设置强密码,并要求用户在首次登录时修改默认密码。 然而,针对具体的h3cf100cg2型号设备的默认密码,由于每个设备的出厂设置可能不同,因此无法提供具体的默认密码。在使用该设备时,用户应按照设备说明书或用户手册上的指引进行设置。如果用户忘记了自己设置的密码或者需要重置设备至出厂状态,建议联系设备的生产厂商或者供应商,获得密码重置的方法或专业技术支持。 总之,在使用任何设备时,保障设备和网络安全都是非常重要的。用户应该采取一些安全措施,例如修改默认密码、定期更换密码、设备固件升级等,以防止网络攻击和未经授权的访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值