)
最大序列和查看题解 查看答案题目描述Time Limit: 1000 msMemory Limit: 32768 mb给出一个整数序列S其中有N个数定义其中一个非空连续子序列T中所有数的和为T的“序列和”。 对于S的所有非空连续子序列T求最大的序列和。 变量条件N为正整数N≤1000000结果序列和在范围-2^63,2^63-1以内。输入输出格式输入描述:第一行为一个正整数N第二行为N个整数表示序列中的数。输出描述:输入可能包括多组数据对于每一组输入数据 仅输出一个数表示最大序列和。输入输出样例输入样例#:复制5 1 5 -3 2 4 6 1 -2 3 4 -10 6 4 -3 -1 -2 -5输出样例#:复制9 7 -1题目来源清华大学/兰州大学机试题#includebits/stdc.h using namespace std; #define N 1000005 #define P 1000000007 long long s[N]; int main(){ int n; while(cin n){ long long dp[n]; for(int i 0; i n; i ){ cins[i]; dp[0] s[0]; dp[i] max(dp[i - 1] s[i], s[i]); } long long m -10000000; for(int i 0; i n; i ){ m max(m, dp[i]); } coutmendl; } }最大子串和查看题解 查看答案题目描述Time Limit: 1000 msMemory Limit: 256 mb输入n个整数的序列求它的最大子串和并输出对应的数。输入输出格式输入描述:多组测试数据。 第一行输入一个整数n0n100。 接下来一行输入n个数用空格隔开保证每个数的绝对值小于1000。输出描述:第一行输出所求子串的序列如果有多个答案输出靠前的答案。 第二行输出最大子串和。输入输出样例输入样例#:复制5 -10 5 2 -8 7输出样例#:复制5 2 7题目来源厦门大学复试机试题#includebits/stdc.h using namespace std; #define N 1000005 #define M -1000005 #define P 1000000007 long long s[N]; int main(){ int n; while(cinn){ int start 0, end 0;//记录 int temp 0;//临时起点 for(int i 0; i n; i ){ cins[i]; } // dp[0] s[0]; long long m s[0], sum s[0]; for(int i 1; i n; i ){ // dp[i] max(dp[i - 1] s[i], s[i]); if(sum 0){//重新开始 sum s[i]; temp i; } else{//继续累加 sum s[i]; } if(sum m){//最大值有变化 m sum; start temp; end i; } }// for(int i start; i end; i ){ if (i start) cout ; couts[i]; } coutendl; coutmendl; } }最大连续子序列查看题解 查看答案题目描述Time Limit: 1000 msMemory Limit: 256 mb给定K个整数的序列{ N1, N2, ..., NK }其任意连续子序列可表示为{ Ni, Ni1, ..., Nj }其中 1 i j K。最大连续子序列是所有连续子序列中元素和最大的一个例如给定序列{ -2, 11, -4, 13, -5, -2 }其最大连续子序列为{ 11, -4, 13 }最大和为20。现在增加一个要求即还需要输出该子序列的第一个和最后一个元素。输入输出格式输入描述:测试输入包含若干测试用例每个测试用例占2行第1行给出正整数K( K 10000 )第2行给出K个整数中间用空格分隔。当K为0时输入结束该用例不被处理。输出描述:对每个测试用例在1行里输出最大和、最大连续子序列的第一个和最后一个元素中间用空格分隔。如果最大连续子序列不唯一则输出序号i和j最小的那个如输入样例的第2、3组。若所有K个元素都是负数则定义其最大和为0输出整个序列的首尾元素。输入输出样例输入样例#:复制6 -2 11 -4 13 -5 -2 10 -10 1 2 3 4 -5 -23 3 7 -21 6 5 -8 3 2 5 0 1 10 3 -1 -5 -2 3 -1 0 -2 0输出样例#:复制20 11 13 10 1 4 10 3 5 10 10 10 0 -1 -2 0 0 0题目来源浙江大学/中国矿业大学/暨南大学机试题#includebits/stdc.h using namespace std; //1. 全局大数组防栈溢出 const int MAXN 1000005; long long s[MAXN]; long long dp[MAXN]; int main() { int k; while(cin k){ if(k 0){ break; } bool negative true; for(int i 0; i k; i ){ cins[i]; if(s[i] 0){ negative false; } } // for(int i 0; i k; i ){ // couts[i] ; // } // coutendl; int start 0, end 0;//记录最大的 int temp 0;//记录临时的起点 注意初始化 int sum s[0], m s[0]; for(int i 1; i k; i ){ if(m 0){//小于0就从i这里重新开始 m s[i]; temp i; } else{//大于0就一直累加 m m s[i]; } if(m sum){//当前的最大值超过之前的那个了 sum m; start temp; end i; } } if(negative){ cout0 s[0] s[k - 1]endl; } else{ coutsum s[start] s[end]endl; } } }字符串区间翻转查看题解 查看答案题目描述Time Limit: 1000 msMemory Limit: 256 mb小诺有一个由0和1组成的字符串现在小诺有一次机会可以选择一个任意的区间[L,R]将该区间内的所有字符串进行翻转(即0-1,1-0)。请问小诺经过一次翻转之后字符串中最多会有多少个1输入输出格式输入描述:第一行输入一个正整数n表示字符串长度n10^7。 接下来一行一个输入一个01字符串。 可能有多组测试数据输入。输出描述:输出题目要求的答案。输入输出样例输入样例#:复制4 1001输出样例#:复制4题目来源杭州电子科技大学/南京大学机试题#includebits/stdc.h using namespace std; char s[1000005]; int main(){ long long n; string str; while(cinn){ cinstr; vectorintresult(n); for(int i 0; i n; i ){ if(str[i] 0){ result[i] 1; } else{ result[i] -1; } } // for(int i 0; i n; i ){ // coutresult[i] ; // } // coutendl; int start 0, end 0; int temp 0; int m result[0], sum result[0]; for(int i 1; i n; i ){ m max(m result[i], result[i]); sum max(m, sum); // if(m 0){ // m result[i]; // temp i; // } // else{ // m m result[i]; // } // // if(m sum){ // sum m; // start temp; // end i; // } } // coutsumendl; int count 0; for(int i 0; i n; i ){ if(str[i] 1){ count ; } } if(sum 0){ coutcountendl; } else{ coutsum countendl; } } }