0
点赞
收藏
分享

微信扫一扫

Codeforces Round #671 (Div. 2)(A->D2(构造))

逸省 2022-09-26 阅读 154

A:​​http://codeforces.com/contest/1419/problem/A​​

解析:

稀里糊涂过得,不想说了。。。

#include <bits/stdc++.h>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
vector<int>g[maxn];
int si[maxn];
int ok = 0 ;
int x,y;
int main(){
int t;
cin >> t;
while(t--) {
int n;
cin>>n;
char s[1005];
scanf("%s",s+1);
int c1=0,c2=0,c3=0,c4=0;
int vis[1005];
if(n==1)
{
if((s[1]-'0')%2)
{
cout<<"1"<<endl;
}
else
cout<<"2"<<endl;
continue;
}
for(int i=1;i<=n;i++)
{
if(i%2&&(s[i]-'0')%2==0)
{
c1++;
}
if(i%2==0&&(s[i]-'0')%2!=0)
{
c2++;
}
}
if(n%2)
{
if(c1<(n/2+1))
cout<<"1"<<endl;
else
cout<<"2"<<endl;
} else
{
if(c2<(n/2))
cout<<"2"<<endl;
else
cout<<"1"<<endl;
}
}
}

B:​​http://codeforces.com/contest/1419/problem/B​​

题意:

给我读懵了。。。

意思就是,n阶台阶,它的阶数是1~n。

如果其还含有n个不相交的正方形,即为nice

给出x个方块,能组成多少个nice?

解析:

列了一下,发现第i个nice其阶数为:2^i-1

根据样例,nice最多30个。

所以把前30个nice的阶数列出来,根据等差数列求出每一阶所需方块数,存起来。

对给出的x,从小到大累加方块数即可。

#include<bits/stdc++.h>
#include<cmath>
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e5+10;
const int mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3f;
const double eps=1e-14;
ll a[50],b[maxn];
ll tot=0;
void init()
{
ll sum=1,x=1;
for(int i=1;i<=30;i++)
{
ll md=pow(2,i)-1;
ll md2=(md*md+md)/2;
a[tot++]=md2;
}
}
int main()
{
int t;
cin>>t;
init();
while(t--)
{
ll n;
cin>>n;

ll sum=0;
int cnt=0;
for(int i=0;i<tot;i++)
{
sum+=a[i];
if(sum<=n)
cnt++;
else
break;
}
cout<<cnt<<endl;
}
}

C:​​http://codeforces.com/contest/1419/problem/C​​

题意:

初始被感染的rating为x,除他之外还有n个初始rating。

每次比赛可以对任意rating进行+-操作,但是总变化数为0。

感染条件:rating与x相同,每次感染发生在每次比赛前和后。

求最少比赛数,以感染所有rating

解析:

1:所有rating都为x,需要0次

2:sum==n*x,此时一次比赛,即可把所有数字变成x,需要1次

3:x在n个初始rating中出现,假设定为id,初始id被感染,然后把除id之外所有非x的rating全变为x,需要补的全安排在id头上(因为总变化数为0),即可感染所有人,需要1次。

4:初始x没有出现,那么第一步,把n-1个全变为x,需要补的放在最后那个头上,n-1个全被感染。第二步,最后那个变为x即可。总共两步。

#include<bits/stdc++.h>
#include<cmath>
#include<map>
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e3+10;
const int mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3f;
const double eps=1e-14;
int a[maxn];
ll tot=0;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,x;
int cnt=0;
cin>>n>>x;
int ok1=0,ok2=0;
int sum = 0 ;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
if(a[i]!=x)
ok1=1;
else
ok2=1;
}
if(!ok1)
{
cout<<"0"<<endl;
}
else if(sum==x*n||ok2)
cout<<"1"<<endl;
else
cout<<"2"<<endl;
}
}

D1:​​http://codeforces.com/contest/1419/problem/D1​​

D2:​​http://codeforces.com/contest/1419/problem/D2​​

题意:

当一个商品小于左边和右边的价格,我们就能购买它,问如何排列商品能让我们能买的最多

D1价格各不相等,D2可相等。

解析:

比赛时D1直接想的是,既然是小于两边,那么小的肯定不能连着排

所以先对价格排序,从小到大放,先从偶数位开始放,然后余下的按奇数位放。

D1过了以后就下了,没想到,这套代码同样能过D2,改都不用改,血亏。。。。

#include <bits/stdc++.h>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
vector<int>g[maxn];
int a[maxn];
int b[maxn];
int vis[maxn];
int ok = 0 ;
int x,y;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=0;
vis[i]=0;
}
sort(a+1,a+1+n);
int tot=1;
for(int i=2;i<=n;i+=2)
{
b[i]=a[tot];
vis[tot]=1;
tot++;
}
int cnt=0;
tot=1;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
b[tot]=a[i];
tot+=2;
}
}
int c=0;
for(int i=2;i<n;i++)
{
if(b[i]<b[i-1]&&b[i]<b[i+1])
c++;
}
cout<<c<<endl;
for(int i=1;i<=n;i++)
cout<<b[i]<<" ";
cout<<endl;
}

 



举报

相关推荐

0 条评论