第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约数的数学题写完, ...
随机推荐
- js display, visible 区别
注意: display:none和visible:hidden都能把网页上某个元素隐藏起来,在视觉效果上没有区别,但是在一些DOM操作中两者有区别: display:none ---不为被隐藏的对象保 ...
- bat 服务启动脚本
当电脑上有多个数据库(特别是Oracle,占用内存大,所以我都是设置为手动启动的,或者想在电脑上运行一下其他UI类软件或玩些游戏的时候也需要暂时关掉,奈何我这渣机(V_V))需要启动或停止的时候,就用 ...
- 4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍
4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍 天涯明月笙 关注 2018.02.20 19:23* 字数 762 阅读 135 ...
- Scrapy分布式爬虫打造搜索引擎- (二)伯乐在线爬取所有文章
二.伯乐在线爬取所有文章 1. 初始化文件目录 基础环境 python 3.6.5 JetBrains PyCharm 2018.1 mysql+navicat 为了便于日后的部署:我们开发使用了虚拟 ...
- Linux入门-第八周
1.用shell脚本实现自动登录机器 #!/usr/bin/expectset ip 192.168.2.192set user rootset password rootspawn ssh $use ...
- Django API 为 D3 提供数据
在工作中见过有的人即便使用了Django,依然还在采取json或geojson的文件形式为页面提供数据,相当于嵌入数据而非加载.下面是个简单有效的例子: 先从 model.py 开始 # models ...
- I Like for You to Be Still【我会一直喜欢你】
I Like for You to Be Still I like for you to be still 我会一直喜欢这你 It is as though you are absent 就算你并不在 ...
- 【Reverse Linked List II】cpp
题目: Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1- ...
- Android环境安装简单总结
1.安装JDK 参考 http://jingyan.baidu.com/article/215817f7e3f2bd1eda1423f4.html 2.安装android SDK 参考 http:// ...
- 微信小程序-----校园头条详细开发之注册登录
1.注册登录功能的实现 1.1结构 1.2 代码实现 1.2.1 为了通信的安全着想,在此我是通过小程序端获得code,然后传递给后端,在后端向微信后台发送api请求,解密,从而得到用户的唯一标示o ...