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程序设计大赛部分题解的更多相关文章

  1. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛

    拖了好久了 链接:https://www.nowcoder.com/acm/contest/90/A来源:牛客网 跳台阶 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K, ...

  2. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--L-用来作弊的药水

    链接:https://www.nowcoder.com/acm/contest/90/L 来源:牛客网 1.题目描述 -- 在一个风雨交加的夜晚,来自异世界的不愿透露姓名的TMK同学获得了两种超强药水 ...

  3. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--E-回旋星空

    链接:https://www.nowcoder.com/acm/contest/90/E 来源:牛客网 1.题目描述 曾经有两个来自吉尔尼斯的人(A和C)恋爱了,他们晚上经常在一起看头上的那片名为假的 ...

  4. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--D-psd面试

    链接:https://www.nowcoder.com/acm/contest/90/D 来源:牛客网 1.题目描述 掌握未来命运的女神 psd 师兄在拿了朝田诗乃的 buff 后决定去实习. 埃森哲 ...

  5. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--G-旋转矩阵

    链接:https://www.nowcoder.com/acm/contest/90/G 来源:牛客网 1.题目描述 景驰公司自成立伊始,公司便将“推动智能交通的发展,让人类的出行更安全,更高效,更经 ...

  6. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--A-跳台阶

    链接:https://www.nowcoder.com/acm/contest/90/A 来源:牛客网 1.题目描述 小明在坐景驰科技研发的无人车到达了目的地. 景驰科技(JingChi.ai)是一家 ...

  7. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 G 旋转矩阵 【模拟】

    链接:https://www.nowcoder.com/acm/contest/90/G 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  8. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛.B.跳一跳,很简单的(Hash 倍增)

    题目链接 首先变换的周期是\(26\),而所有字符是同时变的,所以一共就只有\(26\)种树,我们对\(26\)棵树分别处理. 求某节点到根路径上的字符串,可以从根往下哈希,\(O(n)\)预处理出. ...

  9. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛----随手记录帖

    这是跟学长学姐组队来打的最爽的一次比赛了,也可能是互相组队最后一次比赛了,南哥和楼学姐,省赛之后就退役了,祝他们能考研和面试都有happy ending! 虽然最后没有把F题的n^2约数的数学题写完, ...

随机推荐

  1. 记录一下CSS outline-width 属性

    outline(轮廓)是绘制于元素周围的一条线,位于边框边缘的外围. outline-width指定轮廓的宽度. 注意: 请始终在outline-width属性之前声明outline-style属性. ...

  2. Oracle数据库学习(四)

    11.创建表 crate table tab1(f_id number not null,f_a varchar2(7) not null,f_b number(6,2) not null): 主键: ...

  3. WireShark抓包命令

    本机环回包 在进行通信开发的过程中,我们往往会把本机既作为客户端又作为服务器端来调试代码,使得本机自己和自己通信.但是wireshark此时是无法抓取到数据包的,需要通过简单的设置才可以. 具体方法如 ...

  4. MySQL - EXISTS 和 NOT EXISTS

    语法规则:   SELECT * FROM tableName t WHERE 1 = 1 AND 2 = 2 AND EXISTS (SELECT * FROM tableName t2 WHERE ...

  5. <%%>用法初步认识

    <%%>是用于向客户端插入服务器代码所使用的一种标记 例如为了在HTML页面上展示由服务器提供的当前用户的某条信息或名字等便可使用 前台 <a href="home.asp ...

  6. notification 使用的基本方法

    当某个应用程序希望向用户发出一些提示信息,而应用程序又不在前台,可以借助Notification来实现.发出一条通知后,手机最上方额通知栏会显示一个图标,下来状态栏以后可以看到详细内容. 一.通知的基 ...

  7. 【树状数组】CF961E Tufurama

    挺巧妙的数据结构题(不过据说这是一种套路? E. Tufurama One day Polycarp decided to rewatch his absolute favourite episode ...

  8. A1082 Read Number in Chinese (25)(25 分)

    A1082 Read Number in Chinese (25)(25 分) Given an integer with no more than 9 digits, you are suppose ...

  9. PAT Basic 1083

    1083 是否存在相等的差 给定 N 张卡片,正面分别写上 1.2.…….N,然后全部翻面,洗牌,在背面分别写上 1.2.…….N.将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否 ...

  10. HDU1272小希的迷宫

    小希的迷宫 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一 ...