https://codeforces.com/contest/1256

A:Payment Without Change【思维】

题意:给你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【贪心】

题意:给定一个全排列,你可以选定一个位置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【贪心】

题意:给定一个长度为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【贪心】

题意:给你一个二进制串,你可以交换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】

题意:给定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【思维】

题意:给你两个长度相等的串,每次你可以选定一个长度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 ;
}

【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】的更多相关文章

  1. Codeforces Round #598 (Div. 3)E(dp路径转移)

    题:https://codeforces.com/contest/1256/problem/E 题意:给一些值,代表队员的能力值,每组要分3个或3个以上的人,然后有个评价值x=(队里最大值-最小值), ...

  2. Codeforces Round #598 (Div. 3)- E. Yet Another Division Into Teams - 动态规划

    Codeforces Round #598 (Div. 3)- E. Yet Another Division Into Teams - 动态规划 [Problem Description] 给你\( ...

  3. Codeforces Round #546 (Div. 2) D 贪心 + 思维

    https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...

  4. Codeforces Round #598 (Div. 3) D. Binary String Minimizing 贪心

    D. Binary String Minimizing You are given a binary string of length n (i. e. a string consisting of ...

  5. Codeforces Round #598 (Div. 3) C. Platforms Jumping 贪心或dp

    C. Platforms Jumping There is a river of width n. The left bank of the river is cell 0 and the right ...

  6. Codeforces Round #598 (Div. 3) B. Minimize the Permutation 贪心

    B. Minimize the Permutation You are given a permutation of length n. Recall that the permutation is ...

  7. Codeforces Round #547 (Div. 3) F 贪心 + 离散化

    https://codeforces.com/contest/1141/problem/F2 题意 一个大小为n的数组a[],问最多有多少个不相交的区间和相等 题解 离散化用值来做,贪心选择较前的区间 ...

  8. Codeforces Round #595 (Div. 3)D1D2 贪心 STL

    一道用STL的贪心,正好可以用来学习使用STL库 题目大意:给出n条可以内含,相交,分离的线段,如果重叠条数超过k次则为坏点,n,k<2e5 所以我们贪心的想我们从左往右遍历,如果重合部分条数超 ...

  9. Codeforces Round #554 (Div. 2) D 贪心 + 记忆化搜索

    https://codeforces.com/contest/1152/problem/D 题意 给你一个n代表合法括号序列的长度一半,一颗有所有合法括号序列构成的字典树上,选择最大的边集,边集的边没 ...

随机推荐

  1. day35—JavaScript操作元素(创建、删除)

    转行学开发,代码100天——2018-04-20 JavaScript对DOM元素的创建.删除操作. 1.创建DOM元素 appendChild方法 createElement(ochild); op ...

  2. 002-notepad++语言,编码,字体,背景色

    一.基本操作 1.1.语言 Setting→Perferences→语言选择 1.2.默认编码 编码→使用UTF-8 无BOM编码 1.3.字体 “设置”-->“语言格式设置”-->“字体 ...

  3. 测开之路六十五:UI测试平台之js

    //添加网址的函数,生成一个输入网址的标签,并且把标签append到id为cases下function browser() { var html = '\ <div class="ro ...

  4. SPOJ NICEBTRE - Nice Binary Trees(树 先序遍历)

    传送门 Description Binary trees can sometimes be very difficult to work with. Fortunately, there is a c ...

  5. CSS中设置字体样式

    <style type="text/css"> body{ font-family: SimHei,"微软雅黑",sans-serif; } < ...

  6. 安装Kubernetes V1.16.2

    安装Kubernetes V1.16.2 准备硬件环境 利用VirtualBox准备两台Linux虚拟机(K8S集群2台起步),系统用CentOS(我用的是的CentOS-7-x86_64-DVD-1 ...

  7. sshpass非交互SSH密码验证

    1.yum安装yum install sshpass -y1.1编译安装yum install wget -ywget http://sourceforge.net/projects/sshpass/ ...

  8. 在Eclipse的kepler中执行OSGIproject出错的解决方式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/canlets/article/details/29620301 今天学习OSGI的过程中依照书上所述 ...

  9. PHP实现上传文件到服务器

    <?php /**************************** *** 功能:上传文件到服务器 ****************************/ session_start() ...

  10. CSS世界中的“盒子”

    1.块级元素 HTML标签通常被分为两类:块级元素和内联元素. “块级元素”和“display为block的元素”不是同一个概念.例如<li>元素默认的display值为list-item ...