CF1419ABCD 思維+數學
阿新 • • 發佈:2020-10-23
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\n":"2\n"); } 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\n",t,cnt,(1+t-1)*cnt/2); x-=t*(t-1)/2;ans++;t<<=1;//cnt+=2; } printf("%lld\n",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\n");return;}
if(fl2){printf("1\n");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\n");return;}
printf("2\n");
}
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\n",ans);
for(int i=1;i<=n;i++)printf("%d%c",b[i]," \n"[i==n]);
}
int main()
{
//scanf("%d",&T);
T=1;
while(T--)
{
solve();
}
return 0;
}