【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】
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】的更多相关文章
- Codeforces Round #598 (Div. 3)E(dp路径转移)
题:https://codeforces.com/contest/1256/problem/E 题意:给一些值,代表队员的能力值,每组要分3个或3个以上的人,然后有个评价值x=(队里最大值-最小值), ...
- Codeforces Round #598 (Div. 3)- E. Yet Another Division Into Teams - 动态规划
Codeforces Round #598 (Div. 3)- E. Yet Another Division Into Teams - 动态规划 [Problem Description] 给你\( ...
- Codeforces Round #546 (Div. 2) D 贪心 + 思维
https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...
- 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 ...
- 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 ...
- 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 ...
- Codeforces Round #547 (Div. 3) F 贪心 + 离散化
https://codeforces.com/contest/1141/problem/F2 题意 一个大小为n的数组a[],问最多有多少个不相交的区间和相等 题解 离散化用值来做,贪心选择较前的区间 ...
- Codeforces Round #595 (Div. 3)D1D2 贪心 STL
一道用STL的贪心,正好可以用来学习使用STL库 题目大意:给出n条可以内含,相交,分离的线段,如果重叠条数超过k次则为坏点,n,k<2e5 所以我们贪心的想我们从左往右遍历,如果重合部分条数超 ...
- Codeforces Round #554 (Div. 2) D 贪心 + 记忆化搜索
https://codeforces.com/contest/1152/problem/D 题意 给你一个n代表合法括号序列的长度一半,一颗有所有合法括号序列构成的字典树上,选择最大的边集,边集的边没 ...
随机推荐
- Git学习及使用
一.认知git理论 1.git出现的背景 版本控制 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上 ...
- 《图解设计模式》读书笔记1-1 Iterator模式
目录 迭代器模式的类图 类图的解释 迭代器模式的代码 解释 原因 思想 迭代器模式的类图 类图的解释 名称 说明 Aggregate 集合接口,有提供迭代器的方法 Iterator 迭代器接口,提供迭 ...
- Pollard Rho算法浅谈
Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机 ...
- 校内模拟赛 : Rima —— 字典树+树形DP
首先说一下,对一个刚学Trie树的蒟蒻来说(就是我),这道题是一道好题.Trie树比较简单,所以就不详细写了. Rima 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传 ...
- Ubuntu安装byzanz截取动态效果图
byzanz-record主要参数选项 用法: byzanz-record [选项...] 录制您的当前桌面会话 帮助选项: -?, --help 显示帮助选项 --help-all 显示全部帮助选项 ...
- android测试开发概念
一:测试分类 1.分类概览 按测试阶段划分: 单元测试 集成测试 系统测试 验收测试 按是否覆盖源代码: 黑盒测试: 功能测试: 界面测试 逻辑测试 安装测试 应用性测试 兼容性测试 性能测试: 稳定 ...
- 【洛谷p1036】选数
(一定要声明我太蒟了,这个题扣了一上午……) 算法标签: …… dfs真的不是我所擅长的qwq,这道题的思路其实很简单,就是先dfs搜索所有可能的和,然后判断是不是质数.说着好说,然鹅并不好写: 第一 ...
- #3831 TJOI2013单词
WOJ#3831 TJOI2013单词 题面 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. 输入 第一个一个整数 N ,表示有 ...
- P4542 [ZJOI2011]营救皮卡丘(Floyd+网络流)
P4542 [ZJOI2011]营救皮卡丘 乍一看似乎没啥题相似的 仔细一看,$N<=150$ 边又是双向边,似乎可以用Floyd搞 先跑一遍Floyd处理出$dis[i][j]$ 注意到走 ...
- 6个常用Java 源代码 保护工具(混淆、加密、底层)
6个常用Java 源代码 保护工具(混淆.加密.底层) ProGuard Java源代码保护工具ProGuard的3.6与4.1版 下载地址:http://download.csdn.net/sou ...