【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代表合法括号序列的长度一半,一颗有所有合法括号序列构成的字典树上,选择最大的边集,边集的边没 ...
随机推荐
- STM32之光敏电阻传感器模块的使用
本实验配合2.2寸TFT液晶屏显示,当光弱的时候显示“昏暗”,光强时显示“明亮”. 实验使用的是下图所示的3线光敏电阻传感器模块,用途:光线亮度检测,光线亮度传感器,智能小车寻光模块.模块特色:比较器 ...
- 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...
- linux下rpm包安装、配置和卸载mysq
l WIN10下虚拟机:VMware workstation 12 PRO 安装 # 1.查看系统版本 [root@vm-xiluhua][/home/xiluhua]$ cat /etc/red ...
- 设置chrome解决跨域问题
开发中遇到跨域问题, 解决方法一 以关闭安全验证模式启动chrome,就不会报跨域了 开发阶段,用这个方式是可以的,不然他需要后台配置成 * , 发布会有风险 设置方法: --disable-w ...
- Cordova指令
安装 cordova: npm install -g cordova 创建应用程序 cordova create hello com.example.hello HelloWorld cordov ...
- Java8 Nashorn JavaScript引擎
使用Java8,Nashorn大大提高了JavaScript 引擎引入,以取代现有的Nashorn Java脚本引擎.Nashorn提供2至10倍更好的性能,因为它直接编译代码在存储器,并传递到字节码 ...
- python之从文件中按行读取数据
#!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'jiangwenwen' # 从文件中按行读取数据 file = open(& ...
- Linux终端下简单的登录程序 密码不回显
在Linux进行登录是输入密码不会被回显,所以我也写了个简单的登入程序,使得在输入密码时不再进行回显. #include <stdio.h> #include <stdlib.h&g ...
- CentOS删除Applications中的菜单项
有时候会错误的安装一些软件,可能安装被不成功,但是在左上角的Applications菜单中还是会显示出来,让人很不爽. 现在介绍一个删除掉CentOS Applications中菜单项的方法: 1.安 ...
- Vue2.0源码阅读笔记(四):nextTick
在阅读 nextTick 的源码之前,要先弄明白 JS 执行环境运行机制,介绍 JS 执行环境的事件循环机制的文章很多,大部分都阐述的比较笼统,甚至有些文章说的是错误的,以下为个人理解,如有错误, ...