全部评论
我去。。。最后想这么做的,然后没时间了。结果就90了
666,第一题竟然是这样做的,数学差毁一生啊
是我看不懂题吗,第一题不是连续子串和吗
第一题好巧妙,学习了.贴一下我的
#include <iostream>
#include<vector>
#include<climits>
using namespace std;
int main()
{
//前缀和思想,加剪枝
int n;
int k;
int max_val = INT_MIN;
while(cin>>n){
vector<int> nums(n, 0);
cin>>nums[0];
for(int i=1;i<n;++i){
cin>>nums[i];
nums[i] += nums[i-1];
}
cin>>k;
for(int i=n-1;i>=0;--i){
if(max_val<i+1 && nums[i]%k==0){//剪枝
max_val = i+1;
break;//剪枝
}
}
for(int i=0;i<n;++i){
for(int j=n-1;j>=i;--j){
if(max_val<j-i){
if((nums[j]-nums[i])%k==0){//剪枝
max_val = j-i;
}
}
else//剪枝
break;
}
}
cout<<max_val<<endl;
}
return 0;
}
第二题
#include <iostream>
#include<vector>
#include<climits>
using namespace std;
int main()
{
//思路:分析样例发现,当某个数大于其他数的和时,只用从这个最大数开始.然而因为该数大于其他书的总和,所以分完其他所有人以后,还是有书剩余.不符合条件.
//代码较简单
int n;
int sum;
while(cin>>n){
vector<int> nums(n, 0);
bool flag = true;
for(int i=0;i<n;++i){
cin>>nums[i];
sum += nums[i];
}
for(int i=0;i<n;++i){
if(nums[i]*2>sum){
cout<<"No"<<endl;
flag = false;
break;
}
}
if(flag)
cout<<"Yes"<<endl;
}
return 0;
}
对于sums[n],应该需要sums[n+1],不然会溢出吧,至于modIdx[k+1],只要modIdx[k]就可以了,余数就0到k-1.不过大佬想法确实太6,献上膝盖,佩服!
k倍序列是啥意思?
第二题我觉得不对,https://www.nowcoder.com/discuss/36530?type=0&order=0&pos=59&page=1,看这里的题目描述,分配是随机分配的,所以你不能说其他组的人数和大于第一组就一定能把第一组的所有试卷置换出来。
#-*-coding:utf-8 -*- 大佬方法好强 改成了python版本 n = int(raw_input()) p = map(int ,raw_input().strip().split()[:n]) k = int(raw_input()) sum1 = [0 for i in range(n+1)] ans = [-1 for i in range(n+1)]#存储第一次出现某一个数的下标的值ans【1】 = 2就是表示余数为1在是第二个数 res = -1 for i in range(1,n+1): sum1[i] =sum1[i-1]+p[i-1] m = sum1[i]%k if ans[m]==-1: ans[m]=i else: res = max(res,i-ans[m]) print max(0,res)
首先膜拜算法大神,然后无脑穷举一下。 import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner =new Scanner(System.in); int N=scanner.nextInt(); List<Integer> number=new ArrayList<Integer>(); int sum=0,result=0; for(int i=0;i<N;i++){ number.add(scanner.nextInt()); } int P=scanner.nextInt(); for(int i=0;i<N;i++){ for(int j=i;j<N;j++){ sum+=number.get(j); if(sum%P==0){ result=result>j-i+1?result:j-i+1; } } if(result>N-i)//当前最长比剩余数字个数大,不做了 break;//不跳出会超时,0.83 sum=0; } System.out.println(result); } }
我觉得OK
你笔试后收到面试通知了吗?
相关推荐
点赞 评论 收藏
分享