第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约数的数学题写完, ...
随机推荐
- nginx限制ip访问某些特定url
这两天百度云给我发了一些安全报警邮件,其中一条是有些陌生ip频繁尝试登录我的后台账户,也就是www.runstone.top/admin.给出的建议是限制这些ip访问/admin/这个url,于是经过 ...
- stark组件(1):动态生成URL
项目启动时自动生成URL 效果图: 知识点: Django启动前通过apps下的ready方法执行一个可以生成URL的py文件 include函数主要返回有三个元素的一个元组.第一个是url配置(ur ...
- 自动发现项目中的URL,django1版本和django2版本
一.django 1 版本 routers.py import re from collections import OrderedDict from django.conf import setti ...
- notification 使用的基本方法
当某个应用程序希望向用户发出一些提示信息,而应用程序又不在前台,可以借助Notification来实现.发出一条通知后,手机最上方额通知栏会显示一个图标,下来状态栏以后可以看到详细内容. 一.通知的基 ...
- Cube HDU - 1220(思维)
Cowl is good at solving math problems. One day a friend asked him such a question: You are given a c ...
- [BZOJ1187]神奇游乐园(插头DP)
Description 题意给定一个矩阵,每个格子有权值,在[-1000.1000]内,求一条回路使得回路经过权值和最大,每个格子最多经过一次 2≤n≤100,2≤m≤6 Code #include ...
- LeetCode刷题感想
断断续续用了半年的时间把LeetCode刷完了,之前复习了数据结构与算法.将刷题与复习数据结构结合起来会更有效果.总之不是为了刷题而刷题,而是为了巩固和补充一部分知识. LeetCode真的是一个很好 ...
- day39---mysql基础三
1.索引: 字典得目录,便于数据查找. 原理:将列信息存储在其相关的文件,这些信息使用便于检索的方式如B-tree.哈希来存储 索引的分类: 普通所有:name,只能帮助查找 唯一索引:name,帮助 ...
- phpstorm将本地代码传递到远程服务器
由于对vim不太熟悉,效率比较低,作为过渡阶段,采用本地编写代码,然后上传到开发机上,进行调试 前提是服务器开启了ftp服务:http://www.cnblogs.com/redirect/p/693 ...
- Asp.net自定义控件开发任我行(4)-ViewState保存控件状态
摘要 上一篇我们实现了下拉框的效果,此章的目的主要是保存控件属性状态 内容 我们先来看一个例子,后台代码不变,我们只改UI页面的代码,先在页面上拖放两个控件,一个是我们现在要开发的这个控件,另一个是按 ...