首页 技术 正文
技术 2022年11月16日
0 收藏 852 点赞 2,896 浏览 4394 个字

https://codeforces.com/contest/1256

A:Payment Without Change【思维】

【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】

题意:给你a个价值n的物品和b个价值1的物品,问是否存在取物方案使得价值为s

题解:min(s/n,a)*n+b>=s?YES:NO

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int a,b,n,s;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&a,&b,&n,&s);
printf(min(s/n,a)*n+b>=s?"YES\n":"NO\n");
}
return ;
}

B:Minimize the Permutation【贪心】

【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】

题意:给定一个全排列,你可以选定一个位置i,交换ai和ai+1,每个i只能选一次,问最终最小的排列是什么

题解:从小到大枚举,每次尽可能左移即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int T,n;
int a[],ad[],fl[];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++){scanf("%d",&a[i]);ad[a[i]]=i;fl[i]=;}
int r=;
for(int i=;i<=n;i++)
{
for(int j=ad[i]-;(!fl[j]) && j> && a[j]>a[j+];j--)
{
swap(a[j],a[j+]);
swap(ad[a[j]],ad[a[j+]]);
fl[j]=;
}
}
for(int i=;i<=n;i++)printf("%d%c",a[i]," \n"[i==n]);
}
return ;
}

C:Platforms Jumping【贪心】

【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】

题意:给定一个长度为n的池塘,m块木板以及他们各自的长度,每次你能从i跳到[i+1,i+d],木板之间的相对位置不能移动,求怎么放置木板能使得从0跳到n+1

题解:贪心放到最远端,如果达到当前木板的最右起点限制,则从最右起点限制开始放

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
int n,m,d;
int l[],le[],ans[];
int main()
{
scanf("%d%d%d",&n,&m,&d);
for(int i=;i<=m;i++)scanf("%d",&l[i]);
le[m+]=n+;
for(int i=m;i>;i--)le[i]=le[i+]-l[i];
int now=;
for(int i=;i<=m;i++)
{
if(now+d<=le[i])
{
for(int j=;j<=l[i];j++)ans[now+d+j-]=i;
now=now+d+l[i]-;
}
else
{
for(int j=;j<=l[i];j++)ans[le[i]+j-]=i;
now=le[i]+l[i]-;
}
}
if(now+d<=n)return !printf("NO\n");
printf("YES\n");
for(int i=;i<=n;i++)printf("%d%c",ans[i]," \n"[i==n]);
return ;
}

D:Binary String Minimizing【贪心】

【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】

题意:给你一个二进制串,你可以交换ai和ai+1,问交换次数≤k次的最小串

题解:每次贪心将最前面的0移到前面即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
int T,n;ll k;
int ad[],adn;
char a[];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%I64d%s",&n,&k,a);
adn=;
for(int i=;i<n;i++)
{
if(a[i]=='')
{
if(k>=i-adn){swap(a[i],a[adn]);k-=i-adn;adn++;}
else {swap(a[i],a[i-k]);break;}
}
}
printf("%s\n",a);
}
return ;
}

E:Yet Another Division Into Teams【DP】

【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】

题意:给定n个数,要求你将数分组,每组数至少有三个,每组的值为这组最大值减去最小值,求怎么分使得所有组的值加起来最小

题解:

先从小到大排序
F[i][1/2/3]表示前i个数,最后一组大小为1/2/3及以上时的最小答案,G[i][1/2/3]表示当前状态的F从哪个前置状态转移过来
最终答案就是F[n][3],然后根据G倒推出分组情况即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
int n;
struct node
{
int v,bh,g;
}a[];
bool cmp(const node &T1,const node &T2){return T1.v<T2.v;}
bool cmp2(const node &T1,const node &T2){return T1.bh<T2.bh;}
ll f[][],g[][];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++){scanf("%d",&a[i].v);a[i].bh=i;}
sort(a+,a++n,cmp);
f[][]=a[].v-a[].v;
g[][]=;g[][]=;
for(int i=;i<=n;i++)
{
f[i][]=f[i-][];g[i][]=;
if(i>)f[i][]=f[i-][]+a[i].v-a[i-].v,g[i][]=;
if(i>)
{
if(f[i-][]<=f[i-][])f[i][]=f[i-][]+a[i].v-a[i-].v,g[i][]=;
else f[i][]=f[i-][]+a[i].v-a[i-].v,g[i][]=;
}
else
{
f[i][]=f[i-][]+a[i].v-a[i-].v,g[i][]=;
}
}
int j=,t=;
for(int i=n;i>;i--)
{
a[i].g=t;
if(j==)t++;
j=g[i][j];
}
sort(a+,a++n,cmp2);
printf("%I64d %d\n",f[n][],t-);
for(int i=;i<=n;i++)printf("%d%c",a[i].g," \n"[i==n]);
return ;
}

F:Equalizing Two Strings【思维】

【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】

题意:给你两个长度相等的串,每次你可以选定一个长度k,在串1中选定起点s1,在串2中选定起点s2,同时翻转两个串ch1[s1,s1+k-1],ch2[s2,s2+k-1],求是否存在翻转方案使得两个字符串最终相等

题解:

首先当两个字符串的字符集不相等时一定为NO
考虑翻转长度为k的字符串,其操作相当于若干次翻转长度为2的字符串,所以我们只考虑翻转长度为2的字符串
根据题意,翻转即为交换i和i+1两个字符
考虑交换i,j两个字符,则需要(j-i)+(j-(i+1))次操作,则一定为奇数
考虑交换i,j,k三个字符,则先交换i到正确位置,再交换j,k,相当于两次交换两个字符的操作,则一定为偶数
对于每一组交换组,若其大小为奇数,那么操作次数一定为偶数,存在方案交换
对于每一组交换组,若其大小为偶数,那么这样的组存在偶数个,则存在方案交换,否则不存在方案交换
特殊的,如果字符串中出现两个及以上相同的字母,那么一定存在方案交换,因为我只需要将两个相同字符换到相邻位置
然后对第二个字符串永远操作交换两个相同字母,那么第二个字符串永远不会变,则此时一定存在方案交换使得字符串1变成字符串2

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
int T,n;
char ch1[],ch2[];
int cnt1[],cnt2[],ffl[];
int main()
{
scanf("%d",&T);
while(T--)
{
memset(cnt1,,sizeof(cnt1));
memset(cnt2,,sizeof(cnt2));
scanf("%d%s%s",&n,ch1,ch2);
for(int i=;i<n;i++)cnt1[ch1[i]-'a'+]++,cnt2[ch2[i]-'a'+]++;
int fl=;
for(int i=;i<=;i++)if(cnt1[i]!=cnt2[i]){fl=;break;}
if(fl){printf("NO\n");continue;}
for(int i=;i<=;i++)if(cnt1[i]>){fl=;break;}
if(fl){printf("YES\n");continue;}
int cnt=;
for(int i=;i<n;i++)cnt2[ch2[i]-'a'+]=i;
memset(ffl,,sizeof(ffl));
for(int i=;i<n;i++)
{
if(ffl[i])continue;
ffl[i]=;int tcnt=;
for(int j=cnt2[ch1[i]-'a'+];j!=i;j=cnt2[ch1[j]-'a'+])tcnt++,ffl[j]=;
if(!(tcnt&))cnt++;
}
printf(cnt&?"NO\n":"YES\n");
}
return ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,104
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,580
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,428
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,835
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,918