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;
}