codeforce Round #599(Div.2)
题目传送门
A. Maximum Square
题目意思是给你n个长条,每个长条的高度是num[i](0 < i < n),每一条的宽度都是 1 ;然后求这些长条可以组成的最大面积的正方形的宽度是多少,将它输出来。
题目分析 :因为要求的是正方形,而且面积是最大的,所以既要看它的宽度也要看它的高度。因为多余的面积可以删除掉,所以我们只需要知道min(长,宽)。
所以可以将所有的长度排个序,然后从大到小历经一遍就可以了。
#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio> using namespace std;
const int ma = 2e5 + ;
int num[];
int n; int main()
{
int k;
scanf("%d",&k);
while(k--)
{
scanf("%d",&n);
for(int i = ;i <= n;i++)
scanf("%d",&num[i]);
sort(num+,num+n+,greater<int>());//从大到小排序
int maxn = ;
for(int i = ;i <= n;i++)
{
maxn = max(maxn,min(num[i],i));//i代表着宽度,maxn是最终的答案。
}
printf("%d\n",maxn);
}
return ;
}
B1. Character Swap (Easy Version)
题目意思:给你两个字符串s和t,它们具有相同的长度n,给你一个操作:你可以在s中选择一个下标i [1,n],然后在t中选择一个下标j [1, n],将它们进行交换,即swap(s[i],t[j])。但是你的操作数只有一次,要使得交换后的s与t相同。并且他是要从前往后进行操作的。(当然交换次数也可以是0)
题目分析:因为操作数只有一次,(这个一定要知道,我就是因为没有看到这个条件而wa了一发,还浪费了时间去找其他错误去了,我太菜了)所以要输出YES的话,就只有一种状态可以满足,那就是只有两组不同(我将具有相同下标的s[i] 和t[i]的两个字符看成一组),而且在这四个字符中,只有两个不同的字符,最重要的是两个组的上下的字符也要相同,只有这样才可以输出YES。其它情况下都不行。
看代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio> using namespace std;
const int ma = 2e4 + ;
const int mm = ;
char s[ma],t[ma];
int n,num[mm];
int dig[mm][mm]; int main()
{
int k;
scanf("%d",&k);
while(k--)
{
scanf("%d",&n);
scanf(" %s",&s);
scanf(" %s",&t);
memset(num,,sizeof(num));
for(int i = ; i < n; i++)
num[s[i] - 'a']++,num[t[i] - 'a']++;//num数组是用来储存出现在s和t中字母的次数
bool f = ;
for(int i = ; i < ; i++)
{
if(num[i] & )
{
f = ;//如果出现的次数是奇数的话,那肯定是不行的,因为它都不能平均的分配
break;
}
}
if(f)
{
printf("No\n");
continue;
}
for(int i = ; i < n; i++)
{
if(s[i] == t[i])
continue;
dig[s[i] - 'a'][t[i] - 'a']++;//dis数组是记录是s[i] 和 t[i] 出现的次数,如果可以输出YES的话那么只有一个有值并且它的值为2;因为
//它只能要小于等于不同的两组
}
int nu = ;
for(int i = ; i < ; i++)
{
for(int j = ; j < ; j++)
{
nu += dig[i][j];//nu是记录次数的
if((dig[i][j] & ) || nu > )
{
f = ;
break;
}
}
if(f)
break;
}
if(f)
printf("No\n");
else
printf("Yes\n");
for(int i = ;i < ;i++)
for(int j = ;j < ;j++)
dig[i][j] = ;//还要将dig数组清零
}
return ;
}
B2. Character Swap (Hard Version)
题目意思:跟b1类似,但是它可以执行的操作数增加的变成了小于等于2 * n了,那肯定可以完成。
题目分析:因为执行的次数足够了,所以只有当在字符串s和t中的字符出现了奇数次的时候输出NO,其他情况都可以输出YES,因为我们要从前往后进行操作,所以要先将前面的字符先让它们相等
先拿出s中最前面的那个未操作的字符s[i],在后面的s中找,看是否可以找到s[j],可以的话就交换它们(交换s[j]和t[i]),然后将他们的下标记录下,没有的话,就从t中找,找到t[j]之后先让它跟上面的交换一下(t[j] 和 s[j])再让t[j] 和 t[i] 交换,然后记录下他们的位置,最后将他们的位置输出来就可以了;
看代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector> using namespace std;
const int ma = ;
char s[],t[];
int ans[][];
int nu[ma],k;
struct node
{
char s1,t1;
int index;
};
vector<node> v; int main()
{
scanf("%d",&k);
while(k--)
{
int n;
scanf("%d",&n);
scanf(" %s",&s);
scanf(" %s",&t);
memset(nu,,sizeof(nu));
for(int i = ; i < n; i++)
nu[s[i] - 'a']++,nu[t[i] - 'a']++;//记录在s和t字母出现的次数
bool f = ;
for(int i = ; i < ; i++)
if(nu[i] & )
{
f = ;//如果为奇数就输出NO
break;
}
if(f)
{
puts("No");
continue;
}
int in = ;
bool f1 = ;
for(int i = ; i < n; i++)
{
if(s[i] == t[i])
continue;
node a;
a.s1 = s[i],a.t1 = t[i],a.index = i + ;//将上下两个不同的储存在v中,
v.push_back(a);
}
int len = v.size(),cnt = ;//len代表着有多少组是不同的
for(int i = ; i < len; i++)
{
for(int j = i + ; j < len; j++)
{
if(v[i].s1 == v[j].s1)
{
swap(v[i].t1,v[j].s1);
ans[++cnt][] = v[j].index,ans[cnt][] = v[i].index;//在s的后面找,看是否有跟v[i].s1相同的,有的话就记录下位置,并且要记得交换它们。
break;
}
if(v[i].s1 == v[j].t1)
{
swap(v[j].t1,v[j].s1);
swap(v[j].s1,v[i].t1);
ans[++cnt][] = ans[cnt][] = v[j].index;
ans[++cnt][] = v[j].index,ans[cnt][] = v[i].index;
break;
}
}
}
puts("YES");
printf("%d\n",cnt);
for(int i = ; i <= cnt; i++)
{
printf("%d %d\n",ans[i][],ans[i][]);
ans[i][] = ans[i][] = ;
}
v.clear();//记得要清零
}
return ;
}
codeforce Round #599(Div.2)的更多相关文章
- Codeforces Round #599 (Div. 2) D. 0-1 MST(bfs+set)
Codeforces Round #599 (Div. 2) D. 0-1 MST Description Ujan has a lot of useless stuff in his drawers ...
- codeforce round #467(div.2)
A. Olympiad 给出n个数,让你找出有几个非零并且不重复的数 所以用stl的set //#define debug #include<stdio.h> #include<ma ...
- codeforce round#466(div.2)C. Phone Numbers
C. Phone Numbers time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...
- codeforce round#466(div.2) B. Our Tanya is Crying Out Loud
B. Our Tanya is Crying Out Loud time limit per test1 second memory limit per test256 megabytes input ...
- Codeforce Round #555 Div.3 D - N Problems During K Days
构造题 话说挺水的题..当时怎么就WA到自闭呢.. 先把每个位置按照最低要求填满,也就是相差1..然后从最后一位开始把剩下的数加上,直到不能加为止. #include <bits/stdc++. ...
- Codeforce Round #554 Div.2 C - Neko does Maths
数论 gcd 看到这个题其实知道应该是和(a+k)(b+k)/gcd(a+k,b+k)有关,但是之后推了半天,思路全无. 然而..有一个引理: gcd(a, b) = gcd(a, b - a) = ...
- Codeforce Round #554 Div.2 D - Neko and Aki's Prank
dp 找规律 我好菜啊好菜啊,完全没有思路. 在合法的括号序列中,左括号数一定大于等于右括号数的,所以我们可以先定义平衡度为左括号数-右括号数. 然后可以发现一个惊人的规律..就是在trie同一深度上 ...
- 「日常训练」Skills(Codeforce Round #339 Div.2 D)
题意(CodeForces 614D) 每个人有\(n(n\le 10^5)\)个技能,技能等级都在\([0,10^9]\)的范围,每个技能有一个当前等级,所有技能的最高等级都为A.一个人的力量被记做 ...
- 「知识学习&日常训练」莫队算法(一)(Codeforce Round #340 Div.2 E)
题意 (CodeForces 617E) 已知一个长度为\(n\)的整数数列\(a[1],a[2],-,a[n]\),给定查询参数\(l,r\),问\([l,r]\)内,有多少连续子段满足异或和等于\ ...
随机推荐
- Oracle DataGuard故障转移(failover)后使用RMAN还原失败的主库
(一)DG故障转移后切换为备库的方法 在DG执行故障转移之后,主库与从库的关系就被破坏了.这个时候如果要恢复主从关系,可以使用下面的3种方法: 将失败的主库重新搭建为备库,该方法比较耗时: 使用数据库 ...
- linux下快速列出局域网中所有主机名(计算机名)的脚本
最近有列出局域网中所有主机名的需求(SMB协议里的),但是findsmb命令总是列不全,搜了搜网上也没什么现成的解决方案,于是自己写了个python脚本 脚本会扫描局域网arp表中所有ip,并尝试解析 ...
- maven 一些高级用法命令
发布本地jar到私服 命令 mvn deploy:deploy-file -Dmaven.test.skip=true -Dfile=D:\Downloads\OJDBC-Full\ojdbc6.ja ...
- Python匿名函数_return语句
Python匿名函数: 使用 lambda 关键字创建匿名函数: lambda 定义的函数只是一个表达式,而不是代码块 lambda 函数拥有自己的命名空间,不能够访问参数列表之外的 或 全局命名空间 ...
- PHP sinh() 函数
实例 返回不同数的双曲正弦: <?phpecho(sinh(3) . "<br>");echo(sinh(-3) . "<br>" ...
- Pintech品致全新多功能MDO 704E系列示波器全新推出
2020年 7月,Pintech品致全新推出推出首款具有多个模拟通道和多个数字通道的示波器.每个模拟通道带宽为200 MHz,每个模拟通道采样率同时达1 GSa/s,在一台仪器中,实现精确.可重复的. ...
- x86架构:保护模式下加载并运行用户程序
本章的代码分3个模块: MBR 引导:加载内核core程序 core:包含内核代码段(从磁盘加载用户程序并重定位).内核数据段(存放api名称.临时缓冲.字符串等).API段(供用户程序调用) 用户程 ...
- OJ评测状态
Pending/Waiting 排队等待中 Pending Rejudge 答案重判中 Compiling 正在编译 Running/Judging 运行判断中 Accepted(AC) 程序通过 C ...
- day14.推导式与生成器
一.列表推导式 '''通过一行循环判断,遍历一系列数据的方式''' """ 推导式的语法: val for val in Iterable 三种方式: [val for ...
- 2020重新出发,JAVA语言,JAVA的诞生和发展史
java的诞生 在1991年时候,James Gosling在Sun公司的工程师小组想要设计这样一种主要用于像电视盒这样的消费类电子产品的小型计算机语言. 这些电子产品有一个共同的特点:计算处理能力和 ...