第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛部分题解
A 跳台阶
思路:其实很简单,不过当时直接dp来做了
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<set>
#include<queue>
#include<sstream>
using namespace std;
#define N_MAX 100000+2
#define INF 0x3f3f3f3f
typedef long long ll;
int n;
int dp[][];//跳了i次,当前跳到台阶j int main() {
int t; scanf("%d", &t);
while (t--){
scanf("%d",&n);
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)
dp[][i] = ;
for (int i = ; i <= n;i++) {
for (int j = ; j <= n;j++) {
for (int k = ; k < j;k++) {
dp[i][j] += dp[i - ][k];
}
}
}
int sum = ;
for (int i = ; i <= n;i++) {
sum += dp[i][n];
}
printf("%d\n",sum);
}
return ;
}
D psd面试
题意:求一个字符串的最长回文子序列(注意这个回文子序列不一定是原字符串的连续子串)
思路:设原字符串为s1,s1反转后的字符串为s2,只要求s1,s2的最长公共子序列LCS即可。
AC代码:
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
using namespace std;
#define N_MAX 1500+20
string s;
int dp[N_MAX][N_MAX]; int main(){
while(cin>>s){
for(int i=;i<s.size();i++)
s[i]=tolower(s[i]);
memset(dp,,sizeof(dp));
string re_s(s);
reverse(re_s.begin(),re_s.end());
int n=s.size();
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(s[i]==re_s[j]){
dp[i+][j+]=dp[i][j]+;
}
else{
dp[i+][j+]=max(dp[i+][j],dp[i][j+]);
}
}
}
printf("%d\n",n-dp[n][n]);
}
return ;
}
E 回旋星空
题意:寻找回旋图标的个数,回旋图标定义:三个定点i,j,k,若d(i,j)=d(j,k),则i-j-k构成回旋图标,并且注意i-j-k和k-j-i不是一个回旋图标。
思路:回旋图标一定有中点,每次固定一个顶点,考虑这个顶点与其余的顶点的相连形成的线段当中是否长度相等的线段,若有,则以该顶点为中点,其中两条相等的线段为边,即可构成两个回旋图标。所以每次只要先固定一个顶点,从该点出发寻找是否存在长度相等的线段,并分别计算回旋图标个数即可。
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<map>
using namespace std;
#define N_MAX 1000+2
typedef long long ll;
struct point{
int x,y;
point(int x=,int y=):x(x),y(y){} }p[N_MAX];
int d[N_MAX][N_MAX];
int main() {
int t;scanf("%d",&t);
while(t--){
memset(d,,sizeof(d)); int n;scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
for(int i=;i<n;i++){
for(int j=i+;j<n;j++){
d[i][j]=d[j][i]=(p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y);
}
}
for(int i=;i<n;i++)
sort(d[i],d[i]+n);
int sum=;
for(int i=;i<n;i++){//以每一个点为中转站
int num=;//相连的边的条数
for(int j=;j<n;j++){
if(d[i][j]==d[i][j-]){
num++;
}
else{
sum+=num*(num-);
num=;
}
}
sum+=num*(num-);
}
if(sum==)printf("WA\n");
else printf("%d\n",sum);
}
return ;
}
F 等式
题意:给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数)
思路:等式转化成 nx+ny-xy=0 (等式左右两边分别加上n^2并化简)==>(x-n)(y-n)=n^2,所以只要找到n^2的所有因子即可
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<map>
using namespace std;
#define N_MAX 100000+2
typedef long long ll;
int n;
map<int,int>prime(int n){
map<int,int>m;
for(int i=;i*i<=n;i++){
while(n%i==){
m[i]++;
n/=i;
}
}
if(n!=)m[n]++;
return m;
} int main() {
int t;cin>>t;
while(t--){
cin>>n;
map<int,int>mp=prime(n);
int sum=;
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){
sum*=(it->second*+);
}
printf("%d\n",(sum+)/); return ;
}
J 强迫症的序列
题意:有n个数,每次除了最大的那个数以外其余的都加1,直到所有的数大小相等为止,输出操作次数以及最终的值。
思路:为了求操作次数,换一个方向考虑,题意说除了最大的数字之外其余的数加1,这等价于让当前最大的数字减1,其余数字数值保持不变。这样一来直到所有的数字都和最小的那个数字一样大时不需要再进行操作了。减1的次数即是操作数。
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<string>
using namespace std;
#define N_MAX 100000+20
int n,a[N_MAX];
int main(){
int t;cin>>t;
while(t--){
cin>>n;
for(int i=;i<n;i++)cin>>a[i];
sort(a,a+n);
int sum=;
for(int i=;i<n;i++){
sum+=a[i]-a[];
}
cout<<sum<<" "<<sum+a[]<<endl;
}
return ;
}
G 旋转矩阵
题意:对一个n*m的字符串矩阵进行顺时针逆时针的旋转操作,打印旋转后的矩阵,并注意'|'旋转后后会变成'-','-'会变成'|'
思路:模拟旋转操作即可,设旋转后的矩阵为cur,旋转前的矩阵为prev,找到这两个矩阵元素之间的对应关系即可,若是prev向左旋转得到cur,则对应关系为:cur[m-j+1][i]=prev[i][j](若prev[i][j]是'|'或'-',则旋转后两者互相变换为对方),若prev向右旋转变换到cur,变换关系为cur[j][n-i+1]=prev[i][j](同上)。
AC代码
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
using namespace std;
#define N_MAX 30+20
int n, m;
char pic[N_MAX][N_MAX];
string ope;
int num_l = , num_r = ;
void ope_L(char pic[N_MAX][N_MAX], int n, int m) {//左旋转
char tmp[N_MAX][N_MAX];
memcpy(tmp, pic, sizeof(tmp));
for (int i = ; i<=n; i++) {
for (int j = ; j<=m; j++) {
if (tmp[i][j] == '|')pic[m - j + ][i] = '-';
else if (tmp[i][j] == '-')pic[m - j + ][i] = '|';
else
pic[m - j + ][i] = tmp[i][j];
}
}
}
void ope_R(char pic[N_MAX][N_MAX],int n,int m) {
char tmp[N_MAX][N_MAX];
memcpy(tmp, pic, sizeof(tmp));
for (int i = ; i <= n;i++) {
for (int j = ; j <= m; j++) {
if (tmp[i][j] == '|')pic[j][n - i + ] = '-';
else if (tmp[i][j] == '-')pic[j][n - i + ] = '|';
else
pic[j][n - i + ] = tmp[i][j];
}
}
} int main() {
int t; scanf("%d", &t);
while (t--) {
memset(pic,,sizeof(pic));
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
scanf(" %c", &pic[i][j]); }
}
cin >> ope;
num_l = num_r = ;
for (int i = ; i < ope.size(); i++) {
if (ope[i] == 'L')num_l++;
else num_r++;
}
if (num_l > num_r) { num_l -= num_r; num_r = ; num_l %= ; }
else { num_r -= num_l; num_l = ; num_r %= ; }
while (num_l--) {
ope_L(pic, n, m);
swap(n, m);
}
while (num_r--) {
ope_R(pic, n, m);
swap(n, m);
}
printf("%d %d\n", n, m);
for (int i = ; i <= n;i++) {
for (int j = ; j <= m;j++) {
printf("%c",pic[i][j]);
}
cout << endl;
}
cout << endl;
}
return ;
}
K 密码
题意:字符串Z字排列后再一行一行从左到右的输出。
思路:找规律 第i行字符之间间隔数d1=2(n-1)-2(i-1),d2=2(n-1)-d1;(i=1,2,...,n),间隔d1,d2交替使用
譬如第一行,字符间隔d1=2(n-1),d2为0;....
按照间隔得到新的字符串排列。
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
using namespace std;
#define N_MAX 100000+2
typedef long long ll; int n;
string s;
char fina[N_MAX];
int main() {
int t;cin>>t;
while(t--){
scanf("%d",&n);cin>>s;
if(s.size()<=n||n==){cout<<s<<endl;continue;}
int num=;//记录字符串输出顺序
int x=*n-;
for(int i=;i<=n;i++){
int d1=x-*(i-);int d2=x-d1;
int k=i-,cnt=;
while(k<s.size()){///!!!
fina[num++]=s[k];
if(d1==)k+=d2;
else if(d2==)k+=d1;
else{
if(!(cnt&))k+=d1;
else k+=d2;
cnt++;
}
}
}
for(int i=;i<num;i++)
printf("%c",fina[i]);
puts("");
}
return ;
}
L 用来作弊的药水
直接用快速幂运算
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<set>
#include<queue>
#include<sstream>
using namespace std;
#define N_MAX 100000+2
#define INF 0x3f3f3f3f
#define MOD 1000000005
typedef long long ll;
int n; ll mod_pow(ll x,ll n) {
ll res = ;
while (n) {
if(n&)res = res*x % MOD;
x = x*x % MOD;
n >>= ;
}
return res;
} int main() {
int t; scanf("%d", &t);
while (t--){
ll x, y, a, b;
scanf("%lld%lld%lld%lld",&x,&a,&y,&b);
ll x1 = mod_pow(x, a);
ll x2 = mod_pow(y,b);
if (x1 == x2)puts("Yes");
else puts("No");
}
return ;
}
第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛部分题解的更多相关文章
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛
拖了好久了 链接:https://www.nowcoder.com/acm/contest/90/A来源:牛客网 跳台阶 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K, ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--L-用来作弊的药水
链接:https://www.nowcoder.com/acm/contest/90/L 来源:牛客网 1.题目描述 -- 在一个风雨交加的夜晚,来自异世界的不愿透露姓名的TMK同学获得了两种超强药水 ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--E-回旋星空
链接:https://www.nowcoder.com/acm/contest/90/E 来源:牛客网 1.题目描述 曾经有两个来自吉尔尼斯的人(A和C)恋爱了,他们晚上经常在一起看头上的那片名为假的 ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--D-psd面试
链接:https://www.nowcoder.com/acm/contest/90/D 来源:牛客网 1.题目描述 掌握未来命运的女神 psd 师兄在拿了朝田诗乃的 buff 后决定去实习. 埃森哲 ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--G-旋转矩阵
链接:https://www.nowcoder.com/acm/contest/90/G 来源:牛客网 1.题目描述 景驰公司自成立伊始,公司便将“推动智能交通的发展,让人类的出行更安全,更高效,更经 ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--A-跳台阶
链接:https://www.nowcoder.com/acm/contest/90/A 来源:牛客网 1.题目描述 小明在坐景驰科技研发的无人车到达了目的地. 景驰科技(JingChi.ai)是一家 ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 G 旋转矩阵 【模拟】
链接:https://www.nowcoder.com/acm/contest/90/G 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛.B.跳一跳,很简单的(Hash 倍增)
题目链接 首先变换的周期是\(26\),而所有字符是同时变的,所以一共就只有\(26\)种树,我们对\(26\)棵树分别处理. 求某节点到根路径上的字符串,可以从根往下哈希,\(O(n)\)预处理出. ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛----随手记录帖
这是跟学长学姐组队来打的最爽的一次比赛了,也可能是互相组队最后一次比赛了,南哥和楼学姐,省赛之后就退役了,祝他们能考研和面试都有happy ending! 虽然最后没有把F题的n^2约数的数学题写完, ...
随机推荐
- DOS当中的基本操作命令,如何切换磁盘,如何查看文件和文件夹,如何清屏,进入文件夹的命令,javac是什么意思,作用是什么?DOS如何建文件夹?退出文件夹?
如何切换磁盘:使用盘符+:举例 d: 如何查看文件和文件夹 dir/w 如何清屏: cls (clear screen) 进入文件夹的命令cd ,举例cd JDK javac是什么意思,c 是comp ...
- C++的新特性for-each
C++实验课要求用for each 循环来实现关联容器 map 的输出,一开始完全萌比.查了好久的资料才整理出下面的: C++11新特性之一就是类似java的for each循环: map<in ...
- linux运维、架构之路-MySQL多实例
一.MySQL多实例介绍 一台服务器上开启多个不同的服务端口(3306,3307,3308),运行多个MySQL服务进程,共用一套MySQL安装程序,多实例MySQL在逻辑上看是 ...
- Spring中的单例模式和多例模式的应用
在Spring的配置中,Bean的scope属性中存在两种模式:singleton(单例模式).prototype(多例模式) singleton 单例模式:对象在整个系统中只有一份,所有的请求都用一 ...
- windows_Bat_Scripts查看系统IP-更改regedit-更新系统补丁
1.1 脚本名称 Update_patch.bat 1.2 脚本代码 @echo off :menu cls mode con cols=48 lines=27 & color 0 ...
- Thinkphp5封装上传图片
<?php namespace app\api\controller; use think\Controller; use think\Db; class Plus extends Base{ ...
- 扒一扒 EventServiceProvider 源代码
Ajax用一句话来说就是无须刷新页面即可从服务器取得数据.注意,虽然Ajax翻译过来叫异步JavaScript与XML,但是获得的数据不一定是XML数据,现在服务器端返回的都是JSON格式的文件. 完 ...
- js字符串去掉所有空格
字符串去掉所有空格 "abc 123 def".replace(/\s/g, "") 字符串去掉左右两端空格 " abc 123 def " ...
- 8 REST Framework 实现Web API 1
1 参考博客: http://blog.csdn.net/SVALBARDKSY/article/details/50548073 2 准备工作 1. 环境 Python: Python 3.5 D ...
- [项目1] bloger - day1
项目代码:https://github.com/venicid/Project1--Bloger 1.准备工作 1.创建project PS C:\Users\Administrator\Deskto ...