欢迎来到清街老酒的博客

どんな別れがあったとしても、出会ったことには必ず意味がある

Educational Codeforces Round 94 (Rated for Div. 2)

Educational Codeforces Round 94 (Rated for Div. 2)

A.String Similarity

思路:由题意可知输出n个s[n-1]即可。

#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize ("unroll-loops")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main()
{
	int t,n;
	string s;
	char k;
	scanf("%d",&t);
	while(t--)
	{
		cin>>n;
		cin>>s;
		k=s[n-1];
		for(int i=1;i<=n;i++)
		printf("%c",k);
		printf("\n");		
	}
}

B.RPG Protagonist

题意:有两个袋子大小为p,f,有两种物品分别有c1,c2个,大小分别为s,w,问最多能装多少物品。
思路:枚举第一个袋子会装i个第一个物品,剩下的体积装尽可能多的第二个物品为n个,第二个袋子优先装大小较小的物品,装尽可能多为n1个,然后装大小较大的物品为n2个(若较小的物品装满了第二个袋子则n2为0),最后累加i+n+n1+n2为最终答案。

#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize ("unroll-loops")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main()
{
	ll t,p,f,c1,c2,s,w,n,n1,n2,i;
	ll ans=0,k;
	scanf("%lld",&t);
	while(t--)
	{
		ans=0;
		scanf("%lld%lld",&p,&f);
		scanf("%lld%lld",&c1,&c2);		
		scanf("%lld%lld",&s,&w);
		for(i=0;i<=min(p/s,c1);i++)
		{
			n=(p-i*s)/w;
			n=min(n,c2);
			if(s<=w)
			{
				if(f>=(c1-i)*s)
				{
					n1=c1-i;
					n2=(f-(c1-i)*s)/w;
					n2=min(n2,c2-n);
				}
				else
				{
					n1=f/s;
					n2=0;
				}
			}
			else
			{
				if(f>=(c2-n)*w)
				{
					n1=c2-n;
					n2=(f-(c2-n)*w)/s;
					n2=min(n2,c1-i);
				}	
				else
				{
					n1=f/w;
					n2=0;
				}			
			}
			k=i+n+n1+n2;
			ans=max(ans,k);
		}
		printf("%lld\n",ans);
	}
}

C.Binary String Reconstruction

题意:已知x,字符串s,求字符串p,字符串s由p转化而来,当p[i-x]或p[i+x]为'1'时,s[i]为'1',否则为'0';
思路:若s[i]为'0'则p[i-x]为'0',p[i+x]为'0',然后其余位置置为'1'。然后遍历s检验答案,若s[i]为'1'时,p[i-x]与p[i+x]都不为'1',则矛盾,输出-1;

#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize ("unroll-loops")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main()
{
	int t,h,flag,x;
	char s[200005],p[200005];
	scanf("%d",&t);
	while(t--)
	{
		flag=0;
		cin>>s;
		cin>>x;
		h=strlen(s);
		for(int i=0;i<h;i++)
		p[i]='1';
		p[h]='\0';
		for(int i=0;i<h;i++)
		{
			if(s[i]=='0')
			{
				if(i+x<h)
				p[i+x]='0';
				if(i-x>=0)
				p[i-x]='0';
			}
		}
		for(int i=0;i<h;i++)
		{
			if(s[i]=='1')
			{
				if(i-x>=0&&p[i-x]=='1');
				else if(i+x<h&&p[i+x]=='1');
				else 
				{
					cout<<"-1"<<endl;
					flag=1;
					break;
				}
				
			} 
		}
		if(flag==0)
		cout<<p<<endl;
	}
}

D.Zigzags

题意:给一个数组ai,1<=i<j<k<l<=n,问ai=ak,aj=al的数量
思路:枚举j,l,用cnt数组记录a[j]之前每个a[i]出现的个数,将符合条件的结果记录即可。

#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize ("unroll-loops")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll n,cnt[10005],a[10005],res,num;
int main()
{
	ll t;
	cin>>t;
	while(t--)
	{
		cin>>n;
		res=0;
		memset(cnt,0,sizeof(cnt));
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
		}
		for(int j=1;j<n;j++)
		{
			num=0;
			for(int l=j+1;l<=n;l++)
			{
				if(a[j]==a[l])
				{
					res+=num;
				}
				num+=cnt[a[l]];
			}
			cnt[a[j]]++;
		}
		cout<<res<<endl;
	}
}

E.Clear the Multiset

题意:给出一个数组a[i],有2种操作:1.将一个区域内所有数减一 2:将一个数字变成任意一个比他小的数 求所有数字变为0的最小步数。
思路:最优的2种操作1.将一个区域内的数都减去最小值a[k],需a[k]步 2.将一个数字变为0
若只用操作2将[l,r]区间所有数字变为0需要r-l+1步,只需要含操作1的办法与r-l+1取最小值即可。
操作一过后,最小值a[k]变为0,其左右2边的子结构与原结构类似,可对[l,k-1],[k+1,r]分治递归求解。

#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize ("unroll-loops")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
  
const int MAXN = 5005;  
int a[MAXN];  
int solve(int l, int r)  
{  
    int k = l;  
    if(l > r) return 0;  
    for(int i = l; i <= r; i++)  
        if(a[i] < a[k])  
            k = i;  
    int tmp = a[k];  
    for(int i = l; i <= r; i++)  
        a[i] -= tmp;  
    return min(r-l+1, solve(l, k-1) + solve(k+1, r) + tmp);  
}  
int main()  
{  
    int n;  
    scanf("%d",&n);  
    for(int i = 0; i < n; i++)  
        scanf("%d",&a[i]);  
    printf("%d\n", solve(0, n-1));  
    return 0;  
} 
posted @ 2020-08-27 09:58  清街老酒  阅读(303)  评论(3编辑  收藏  举报