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]\)内,有多少连续子段满足异或和等于\ ...
随机推荐
- 第三章 Java面向对象(上)
3.1.概述 概述:面向对象是相对面向过程而言,面向对象和面向过程都是一种思想,面向过程强调的是功能行为,面向对象则是将功能封装进对象,强调具备功能的对象,面向对象是基于面向过程的.面向对象的三大特征 ...
- 06_Python基础课程
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"软件测试"获取视频和教程资料! b站在线视频 Pyth ...
- Pandas 复习
1.导包 import pandas as pd 2.数据读取,文件在该代码文件夹内 food_info = pd.read_csv('food_info.csv') 3.查看类型 food_info ...
- 7-Pandas之索引调整方法
一.调整索引.修改列标签 1.调整索引的两种情况: 重新索引 设置新的索引 (1)重新索引 在Pandas对象中,其实索引也是一个对象,所以可对其进行修改. 例如:df.index=['a','b', ...
- Prometheus的伴侣:Grafana在centos下的搭建
Grafana 是一款采用 go 语言编写的开源应用,主要用于监控指标数据的可视化展现,是当前最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库.Grafana常常搭配用作Promethe ...
- Java助教工作总结
很荣幸在步入在研究生之际,有机会能协助代老师完成面向对象程序设计(java)课程的教学工作.这也是我人生中第一次接触助教工作,好多东西不太清楚,也没经验,有什么做的不好的,还望老师同学及时指出. 上周 ...
- python基础语法和实战练习
(一)Python基础学习 Num01:python的基本数据类型 ①字符串:可进行拼接和截取 ②数字:int,float,complex(复数) 涉及到格式转换:int(x)转换为整数,float( ...
- 铁大树洞APP视频讲解和原型演示
首先放上我们团队视频讲解演示的视频:https://v.youku.com/v_show/id_XNDYyMzA3MTgzNg==.html 团队名称:超能陆战队 团队成员:刘梦鑫(队长) 段行行 徐 ...
- Android Studio--家庭记账本(六)
(Android studio家庭记账本源码已上传至github,https://github.com/xhj1074376195/CostBook_app) 今天记账本终于可以算是完成了,实现了账户 ...
- 90行代码让微信地球转起来,太酷了!(python实现)
1.微信地球 手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个 张小龙 . 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. ...