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. pillow模块快速学习

    一.pillow的简单使用 1.安装 方式一: 如果配置了python中的script路径为环境变量,直接cmd中执行如下命令: pip3 install pillow 方式二: 通过编译器环境,如p ...

  2. Jenkins 官网文档翻译汇总

    Jenkins 官网地址 Jenkins 官网文档地址 用户手册 安装 Jenkins 使用 Jenkins 使用凭证 Pipeline 流水线 开始使用 Pipeline 使用 Jenkinsfil ...

  3. 解决Sql Server服务远程过程调用失败

    方法一:修复Sql Server: 修复过程中若遇到:重新启动计算机失败, 1.按下组合键[Win]+[R],调出运行窗口 2.输入“regedit”,在注册表左侧目录栏中找到如下位置:“HKEY_L ...

  4. html5_websql

    var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);  var msg;  db.transaction(function ...

  5. express框架中router组件的app.use和app.get

    首先看例子: var express = require('express'); var router = express.Router(); var index = require('./route ...

  6. Vue / keep-alive使用

    keep-alive keep-alive是Vue提供的一个抽象组件,用来对组件进行缓存,从而节省性能,由于是一个抽象组件,所以在v页面渲染完毕后不会被渲染成一个DOM元素 <keep-aliv ...

  7. redis命令行命令

    配置文件设置密码认证 修改redis.conf去掉#requirepass foobared前面的#,foobared就是密码,可以进行修改 redis命令设置密码认证config set requi ...

  8. 【学习总结】Python-3-转义字符

    参考: 本教程的评论区:菜鸟教程-Python3-Python数字 转义字符: 在需要在字符中使用特殊字符时,python用反斜杠()转义字符 END

  9. Vue小白篇 - Vue介绍

    Vue ?啥是Vue?能干嘛? vue 的介绍 Vue 是一套用于构建用户界面的 渐进式框架 ,与其它大型框架不同的是, Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层 前端三大框 ...

  10. 转载一篇别人分享的VSFTPD.CONF的中文解释方便以后查询

    # 服务器以standalong模式运行,这样可以进行下面的控制 listen=YES # 接受匿名用户 anonymous_enable=YES # 匿名用户login时不询问口令 no_anon_ ...