CF1419ABCD 思维+数学

Posted worcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1419ABCD 思维+数学相关的知识,希望对你有一定的参考价值。

CF1429A 思维
题意:
给定一个长度(n)序列,两个人可以轮流取,alice取奇数位,bob取偶数位,若最后留下的数是奇数则alice胜,否则bob胜
题解:
可以知道最终留下的数是奇数位/偶数位,那么尽量留下奇数/偶数即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#define INF 1e9+7
#define ll long long
using namespace std;
int T,n;
char ch[2001];
void solve()
{
	scanf("%d%s",&n,ch);
	bool fl=0;
	if(n&1)
	{
	  fl=0;
	  for(int i=1;i<=n;i+=2)if((ch[i-1]-‘0‘)&1)fl=1;
	}
	else
	{
	  fl=1;
	  for(int i=2;i<=n;i+=2)if(!((ch[i-1]-‘0‘)&1))fl=0;
    }
    printf(fl?"1
":"2
");
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
	  solve();
	}
	return 0;
}

CF1419B 数学
题意:
(x)个小格子
小格子组成(i*i)的大块
每个阶梯由若干个大块组成
一个(n)阶梯是美丽的,当且仅当他用(n)个大块组成
求可以组成多少个不同的美丽阶梯
题解:
阶梯只有满足(2^n-1)才可以美丽
于是从小到大枚举计算答案

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#define INF 1e9+7
#define ll long long
using namespace std;
int T;
ll x,ans; 
void solve()
{
    scanf("%lld",&x);
    ll t=2;ans=0;
    while(t*(t-1)/2<=x)
    {
    	//printf("  %lld %lld %lld
",t,cnt,(1+t-1)*cnt/2);
      x-=t*(t-1)/2;ans++;t<<=1;//cnt+=2;
	}
	printf("%lld
",ans);
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
	  solve();
	}
	return 0;
}

CF1419C 思维
题意:
一开始有一个病原体,其能量为x
有n个人,每个人有个免疫值,当一个人的免疫值等于某个被感染的人的免疫值时,他将会被感染
初始免疫值等于病原体能量时,会直接被感染
随后可以选定若干个人,对他们的免疫值进行修改,要求修改量的总和等于0,修改后立即进行感染
求是所有人感染的最少操作次数
题解:
如果所有人的免疫值都等于病原体能量,那么初始就会感染所有人,ans=0
如果存在有人的免疫值初始等于病原体能量,那么他一开始被感染,但是有初始免疫值不同于病原体能量的,那么此时选一个被感染的,和所有未被感染的变成一个相同的值,那么一定可以将剩下的都感染,ans=1
如果所有人的初始免疫值都不等于病原体能量,那么求他们的平均值,如果平均值等于病原体能量,那么直接将所有值改为平均值,ans=1,否则需要先感染一部分,再用这一部分感染剩下的人,ans=2

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#define eps 1e-7
#define ll long long
using namespace std;
int T,n,x;
int a[1001],sum;
double r;
void solve()
{
    scanf("%d%d",&n,&x);
    int fl=0,fl2=0;
    for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]!=x)fl=1;if(a[i]==x)fl2=1;}
    if(!fl){printf("0
");return;}
    if(fl2){printf("1
");return;}
    sum=0;
    for(int i=1;i<=n;i++)sum+=a[i];
    r=sum*1.0/n;
    if(fabs(r-x)<eps){printf("1
");return;}
    printf("2
");
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
	  solve();
	}
	return 0;

CF1419D 思维
题意:
给定n个数,将其重新排列,一个数是好的,当且仅当他比周围两个数要小,求如何排列可以得到最多的好数
题解:
排序之后大小大小间隔排

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#define INF 1e9+7
#define ll long long
using namespace std;
int T,n;
int a[100001],b[100001];
void solve()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+1+n);
    int t=n/2+1;
    for(int i=t;i<=n;i++)b[(i-t)*2+1]=a[i];
	for(int i=1;i<t;i++)b[i*2]=a[i];
	int ans=0;
	for(int i=2;i<n;i++)if(b[i]<b[i-1] && b[i]<b[i+1])ans++;
	printf("%d
",ans);
	for(int i=1;i<=n;i++)printf("%d%c",b[i]," 
"[i==n]);
}
int main()
{
	//scanf("%d",&T);
	T=1;
	while(T--)
	{
	  solve();
	}
	return 0;
}



























以上是关于CF1419ABCD 思维+数学的主要内容,如果未能解决你的问题,请参考以下文章

CF 466C Number of Ways(数学 / 思维 / DP)

8/5 基础思维(div2 ABCD)+dp+AC自动机

E. DeadLee 思维 贪心 cf官方答案代码详解

代码源 Div1 - 107#452. 序列操作(思维)CF1198B

[贪心] aw3774. 亮灯时长(思维+后缀和+代码细节+CF1000B)

代码源 Div1 - 107#452. 序列操作(思维)CF1198B