爱奇艺笔试题

1.对称字符串问题
Time Limit: 1000/1000 MS (Others/C,C++) Memory Limit: 65536/65536 K (Others/C,C++)
Problem Description:
计算给定字符串中的最长对称子串长度,例如“iqiyi”中的最长对称子串为“i”,“iqiyiyiq”的最长对
称子串为“qiyi”和“iyiq”,长度为4。给定字符串为纯小写字母的组合。
输入
输入数据为单行字符串,只含有小写字母,中间无空格。
输出
最长对称子串的长度。
样例输入
iqiyiyiq
abccba
样例输出
4
3

这题直接暴力,或者manacher算法,左老师讲过,自己没有实现过。。。就用了暴力
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <string>

using namespace std;

void LongestSubStr(const string &str) {
	string res(str.size() * 2,'0');
	int i, j;
	j = 0;
	for (i = 0; i < str.size(); i++) {
		res[j++] = str[i];
		res[j++] = '#';
	}
	int len = 0;
	for (int j = 1; j < res.size(); j++) {
		int left = j - 1;
		int right = j + 1;
		int max = 0;
		while (left >= 0 && right < res.size() && res[left] == res[right]) {
			left--; right++;
			++max;
		}
		if (max > len)
			len = max;
	}
	if (len == 0) {
		printf("%d\n", len + 1);
		return;
	}
	printf("%d\n", (len + 1) / 2);

}
int main()
{
	string str;
	while(cin >> str)
		LongestSubStr(str);
	system("pause");
	return 0;
}
2.小Q的包裹
Time Limit: 1000/1000 MS (Others/C,C++) Memory Limit: 65536/65536 K (Others/C,C++)
Problem Description:
小Q在国外上学,业余时间兼职代购补贴学费。假定她每周向国内寄回一个包裹,包裹的重量上限是m,小Q的利润是包裹价值的10%。
现在小Q有n件物品准备寄出,每件物品的重量和价值不等,小Q想知道这个包裹最多能获得多少利润?
输入
第一行数据是两个正整数,分别表示包裹的重量上限m和物品的总数n
第二行数据是n个正整数,表示第一件,第二件...第n件物品的重量
第三行数据是n个正整数,表示第一件,第二件...第n件物品的价值
输出
为1个实数,保留小数点后一位,表示小Q在这个包裹上能赚到的利润。

样例输入
10 5
2 2 6 5 4
6 3 5 4 6
样例输出
1.5

这个题是0-1背包问题,直接上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>

using namespace std;
//0-1背包问题
void DP(int n, int m) {
	float res;

	int *weight = new int[m];
	int *value = new int[m];
	int **dp = new int*[m];  //dp[i][j]表示第i个物品,背包容量为j时的最大价值
	for (int i = 0; i < m; i++)
		dp[i] = new int[n + 1];

	for (int i = 0; i < m; i++)
		cin >> weight[i];
	for (int i = 0; i < m; i++)
		cin >> value[i];

	for (int i = 0; i < m; i++)
		dp[i][0] = 0;
	for (int i = 0; i <= n; i++) { //这里是<=
		if (i >= weight[0])  //这里是>=
			dp[0][i] = value[0];
		else
			dp[0][i] = 0;
	}
	for (int i = 1; i < m; i++) {
		for (int j = 1; j <= n; j++) {
			if (j < weight[i])
				dp[i][j] = dp[i - 1][j];
			else
				dp[i][j] = dp[i - 1][j] > dp[i - 1][j - weight[i]] + value[i] ? dp[i - 1][j] : dp[i - 1][j - weight[i]] + value[i];
		}
	}

	res = dp[m - 1][n] * 0.1;
	printf("%2.1f\n", res);
}

int main()
{
	int m, n;	
	while(cin >> n >> m)  //m表示物品种数
		DP(n, m);
	system("pause");
	return 0;	
}
全部评论
2、草原坝上滑梯 只能从上下左右侧移动 输入:行数R   列数C 输出:最长区域的长度 样例: 1    2   3   4   5   16 17 18 19  6 15  24 25 20 7 14  23 22 21 8 13 12  11  10 9 输出:25 #include <iostream> #include <algorithm> using namespace std; int r;//行 int c;//列 int a[1000][100];//输入矩阵 int result[1000][1000];//输出矩阵 //递归思想:分别求出上下左右方向的最大长度 int maxLength(int i, int j) { int left = j - 1; int right = j + 1; int high = i - 1; int low = i + 1; int left_value; int right_value; int high_value; int low_value; //左侧最大长度 if (left >= 0 && a[i][left] < a[i][j]) left_value = maxLength(i, left) + 1; else left_value = 0; //右侧最大长度 if (right <= c - 1 && a[i][right] < a[i][j]) right_value = maxLength(i, right) + 1; else right_value = 0; //上侧最大长度 if (high >= 0 && a[high][j] < a[i][j]) high_value = maxLength(high, j) + 1; else high_value = 0; //下侧最大长度 if (low <= r - 1 && a[low][j] < a[i][j]) low_value = maxLength(low, j) + 1; else low_value = 0; int max1 = max(high_value, low_value); int max2 = max(left_value, right_value); return max(max1, max2); } int main() { while (cin >> r >> c) { //初始化矩阵 for (int i = 0; i < r; i++) for (int j = 0; j < c; j++) cin >> a[i][j]; //计算每一个位置的最大长度 for (int i = 0; i < r; i++) for (int j = 0; j < c; j++) result[i][j] = maxLength(i, j); //寻找所有位置中最大的长度 int maxLen = 0; for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) if (result[i][j] > maxLen) maxLen = result[i][j]; } cout << maxLen + 1 << endl; } system("pause"); return 0; }
点赞 回复 分享
发布于 2016-08-28 22:20
第二题只通过了50%。。。还没找到原因
点赞 回复 分享
发布于 2016-08-28 21:19
内推的?
点赞 回复 分享
发布于 2016-08-28 21:20
第一题100%,第二天也是背包75%;
点赞 回复 分享
发布于 2016-08-28 21:23
额 忘了内推了,内推截止了?
点赞 回复 分享
发布于 2016-08-28 21:28
你的第二题是我的第一题埃
点赞 回复 分享
发布于 2016-08-28 21:31
java的怎样实现多行输入,回车之后显示结果。一直在调工具。纠结。。
点赞 回复 分享
发布于 2016-08-28 21:41
第一题那个对称子串是什么意思啊,一直想不明白
点赞 回复 分享
发布于 2016-08-28 22:38
//0-1背包问题 #include <iostream> #include <vector> using namespace std; int DP(int maxW, int i, vector<int>& weightVec,vector<int>& valueVec) { if(i == 0) { if(maxW - weightVec[i] > 0) return valueVec[i]; else return 0; } int iOut = DP(maxW, i - 1, weightVec, valueVec); if(maxW - weightVec[i] > 0) { int iIn = DP(maxW - weightVec[i], i - 1, weightVec, valueVec); return iIn + valueVec[i]> iOut ? iIn+ valueVec[i] : iOut; } return iOut; } int main() { int maxW, n, temp; cin>>maxW>>n; vector<int> weightVec, valueVec; for (int i = 0; i < n; ++i) { cin>>temp; weightVec.push_back(temp); } for (int i = 0; i < n; ++i) { cin>>temp; valueVec.push_back(temp); } cout<<(float)DP(maxW, n - 1, weightVec, valueVec)/10.0; return 0; }
点赞 回复 分享
发布于 2016-08-28 22:43
//股票问题,数组中存放每天股票价格,求获得最大利润 #include <iostream> #include <vector> using namespace std; int main() { vector<int> vVec; int len = 0, temp = 0; while(cin>>temp) vVec.push_back(temp); len = vVec.size(); if(len <= 1) return 0; int min = vVec[0], max = 0; for (int i = 1; i < len; ++i) { if(vVec[i] < min) { min = vVec[i]; continue; } if(max < vVec[i] - min) max = vVec[i] - min; } cout<< max; return 0; }
点赞 回复 分享
发布于 2016-08-28 22:49
太水了,20分不到两题就搞定了
点赞 回复 分享
发布于 2016-08-29 00:07
感觉你们代码都好长,其实10行左右就能搞定
点赞 回复 分享
发布于 2016-08-29 00:07
weight,num_of_goods=input().split(' ') weight,num_of_goods=int(weight),int(num_of_goods) each_weight=input().split(' ') for i in range(len(each_weight)): each_weight[i]=int(each_weight[i]) values=input().split(' ') for i in range(len(values)): values[i]=int(values[i]) res=[] def sol_2(W,V,weight,result): global res if weight<0: return 0 if len(W)==1: if weight-W[0]<0: result=result else: result+=V[0] res.append(result) else: #要 sol_2(W[1:],V[1:],weight-W[0],result+V[0]) #不要 sol_2(W[1:],V[1:],weight,result) sol_2(each_weight,values,weight,0) print("%.1f"%(max(res)*0.1))
点赞 回复 分享
发布于 2016-08-29 14:27
第一题的暴力算法,为什么要在字符串中加入'#'?看了思路觉得不加这个也可以,会出现什么问题么?
点赞 回复 分享
发布于 2016-08-29 21:12

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
10-15 16:27
门头沟学院 C++
LeoMoon:建议问一下是不是你给他付钱😅😅
点赞 评论 收藏
分享
点赞 39 评论
分享
牛客网
牛客企业服务