1.Contest2425 - 毕老师算法试验一

传送门在这里
题目总览:

A.排列问题

// 排列问题// 输出一个可能含有反复字符的字符串,打印出该字符串中所有字符的全排列。#include<bits/stdc++.h>using namespace std;bool IsSwap(vector<char> &chars, int nBegin, int nEnd){    for(int i=nBegin; i<nEnd; i++)  //记住是<nEnd    {        if(chars[i] == chars[nEnd]) return false;    }    return true;}void Perm(vector<char> &chars, int k, int m){    if(k==m)     {        for(const char x:chars)         {            cout<<x;        }        cout<<endl;    }    else    {        for(int i=k; i<=m; i++)        {            if(IsSwap(chars, k, i))            {                swap(chars[k], chars[i]);                Perm(chars, k+1, m);                swap(chars[k], chars[i]);            }        }    }}void Foo(vector<char> &chars){    Perm(chars, 0, chars.size()-1);}// 字符串bool IsSwap(string str, int nBegin, int nEnd){    for(int i=nBegin; i<nEnd; i++)  //记住是<nEnd    {        if(str[i] == str[nEnd]) return false;    }    return true;}void Perm2(string str, int k, int m){    if(k==m)     {        cout<<str;        cout<<endl;    }    else    {        for(int i=k; i<=m; i++)        {            if(IsSwap(str, k, i))            {                swap(str[k], str[i]);                Perm2(str, k+1, m);                swap(str[k], str[i]);            }        }    }}void Foo2(string str){    str.pop_back();    cout<<str<<endl;    Perm2(str, 0, str.length()-1);}int main(){    // vector<char> chars;    // int n;    // cin>>n;    // char ele;    // for(int i=0; i<n; i++)     // {    //     cin>>ele;    //     chars.push_back(ele);    // }    // // for(const char x:chars) cout<<x;    // Foo(chars);    string str;    // scanf("%s", str);  https://blog.csdn.net/liu16659/article/details/86772657  不倡议应用scanf输出string类型    cin>>str;    Foo2(str);    system("pause");    return 0;}

B.疾速幂

// B.疾速幂#include<bits/stdc++.h>using namespace std;const long long Mod = 1e8 + 7;typedef long long ll;ll Pow(ll base, ll power){    ll result = 1;    for(int i=1; i<=power; ++i)    {        result *= power;        result %= 1000;  //每步后果提前进行取模    }    return result%1000;}// 疾速幂// 所以咱们疾速幂算法的核心思想就是每一步都把指数分成两半,// 而相应的底数做平方运算。这样不仅能把十分大的指数给一直变小,// 所须要执行的循环次数也变小,而最初示意的后果却始终不会变ll fastPow(ll base, ll power){    ll result = 1;    while(power>0)    {        if(power%2 == 0)        {            base = base*base % Mod;            power /= 2;        }        else         {            power -= 1;            result = result*base % Mod;            base = base*base % Mod;            power /= 2;        }    }    return result;}ll myPow(int x){    ll result = 0;    for(int i=1; i<=x; ++i)        result += fastPow(i, i);    return (result+1)%Mod;}int main(){    int x;    while(cin>>x)    {        cout<<myPow(x)<<endl;    }    system("pause");    return 0;}

C.求第k小的数

// C.求第k小的数#include<bits/stdc++.h>using namespace std;int Partition(int a[], int low, int high);template<class Type>int RandomizedPartition(Type a[], int p, int r);template<class Type>void RandomizedQuickSort(Type a[], int p, int r);template<class Type>Type RandomizedSelect(Type a[], int p, int r, int k);int main(){    // int n, k;    // cin>>n>>k;    // vector<int> vec;    // for(int i=0; i<n; ++i)    // {    //     int num;    //     scanf("%d", &num);    //     vec.push_back(num);    // }    // sort(vec.begin(), vec.end());    // cout<<vec[k-1];    int a[100], n;    while(~scanf("%d", &n))    {        memset(a, 0, sizeof(a));        for(int i=0; i<n; i++) scanf("%d",&a[i]);        int k;        scanf("%d", &k);        cout<<RandomizedSelect(a, 0, n-1, k)<<endl;    }    system("pause");    return 0;}// 2.RandomizedSelect,均匀工夫复杂度O(n)int Partition(int a[], int low, int high){    int key = a[low];    while(low<high)    {        while(low<high&&a[high]>key) --high;        a[low] = a[high];        while(low<high&&a[low]<=key) ++low;        a[high] = a[low];    }    a[low] = key;    return low;}template<class Type>int RandomizedPartition(Type a[], int p, int r){    int i = rand()%(r-p+1) + p;    swap(a[i], a[p]);    return Partition(a, p, r);}// template<class Type>// void RandomizedQuicksort(Type a[], int p, int r)  //随机快排// {//     if(p<r)//     {//         int q = RandomizedPartition(a, p, r);//         RandomizedQuicksort(a, p, q-1); //对左半段排序//         RandomizedQuicksort(a, q+1, r); //对右半段排序//     }// }template<class Type>Type RandomizedSelect(Type a[], int p, int r, int k)  //随机划分,抉择{    if(p == r) return a[p];    int loc = RandomizedPartition(a, p ,r);    int count = loc-p+1; //count为a[p:r]中的元素个数    if(k<=count) return RandomizedSelect(a, p, loc, k);    else return RandomizedSelect(a, loc+1, r, k-count);}

D.外部收益率

// D.外部收益率#include<bits/stdc++.h>using namespace std;int main(){    int a[100], n;    while(scanf("%d", &n) && n)    {        for(int i=0; i<=n; i++) scanf("%d", a+i);        double x = -1.0, y=1e6, irr, npv;        for(int j=0; j<200; j++)        {            irr = (x+y)/2;   //枚举irr的取值范畴[-1.0, 1e6], 二分法迫近 (至于这个范畴怎么来的,我就不分明了.数学问题)            npv = 0;            for(int k=0; k<=n; k++)                npv += 1.0*a[k]/pow(1+irr, k);            if(fabs(npv)<1e-6) break;  //小于一个阈值,认为就是方程的解            if(npv < 0) y = irr;            if(npv > 0) x = irr;        }        printf("%.2lf\n", irr);        memset(a, 0, sizeof(a));  //每次重置a数组    }    // cout<<9/2.25<<endl;    system("pause");    return 0;}

E.跳台阶

// 跳台阶#include<bits/stdc++.h>using namespace std;// f(x) = f(x-1) + f(x-2)int climbStairsMemo(int n, vector<int>& memo){    if(memo[n]>0) return memo[n];  //记录数组    if(n==1 || n==2) memo[n] = n;    else memo[n] = climbStairsMemo(n-1, memo) + climbStairsMemo(n-2, memo);    return memo[n];}int climbStairs(int n) {    vector<int> memo(n+1, 0);    return climbStairsMemo(n, memo);}// 滚动数组 将空间复杂度由O(n)优化成O(1)int climbStairs2(int n){    int p=0, q=0, r=1;    for(int i=1; i<=n; i++)    {        p = q;        q = r;        r = p+q;    }    return r;}int main(){    int n;    cin>>n;    cout<<climbStairs2(n)%1000000007<<endl;    system("pause");    return 0;}

2.Contest2445 - 毕老师算法试验二

传送门在这里
题目总览:

A.沙子的品质

// A.沙子的品质  OJ作业一D题// 动静布局#include<bits/stdc++.h>using namespace std;const int inf = 0x3f3f3f3f;  //为什么用0x3f3f3f3f而不必0xffffff  https://blog.csdn.net/jiange_zh/article/details/50198097int Compute(int *nums, int n){    int Sum[n+1]={0};    int DP[n+1][n+1];   //之前用DP[1005][1005],导致栈空间溢出  https://blog.csdn.net/kangyupl/article/details/90723367    memset(DP, inf, sizeof(DP));    for(int i=1; i<=n; i++)    {        Sum[i] = Sum[i-1] + nums[i];        DP[i][i] = 0;    }    for(int Len=2; Len<=n; Len++)        for(int left=1; left<=n-Len+1; left++)        {            int right = left+Len-1;            for(int k=left; k<right; k++)            {                DP[left][right] = min(DP[left][k]+DP[k+1][right]+Sum[right]-Sum[left-1], DP[left][right]);            }        }    return DP[1][n];}int main(){    int n;    cin>>n;    int nums[n+1];    nums[0] = 0;    for(int i=1; i<=n; ++i) cin>>nums[i];     cout<<Compute(nums, n)<<endl;    system("pause");    return 0;}

B.最长公共子序列

// B.最长公共子序列 OJ作业一F题// 动静布局#include<bits/stdc++.h>using namespace std;int longestCommonSequence(string a, string b){    int M = a.size();    int N = b.size();    vector<vector<int>> DP(M+1, vector<int>(N+1, 0));    for(int i=1; i<=M; ++i)    {        for(int j=1; j<=N; ++j)        {            if(a[i-1]==b[j-1]) DP[i][j] = DP[i-1][j-1] + 1;            else DP[i][j] = max(DP[i-1][j], DP[i][j-1]);        }    }    return DP[M][N];}int main(){    string a, b;    cin>>a>>b;    cout<<longestCommonSequence(a, b)<<endl;    system("pause");    return 0;}

C.三角形的门路权

// C.三角形最小门路权// Leetcode 125题// 动静布局#include<bits/stdc++.h>using namespace std;// 了解谬误,直角三角形的状况.int minimumTotal2(vector<vector<int>> &triangle){    int n = triangle.size();    vector<vector<int>> dp(n, vector<int>(n));    dp[0][0] = triangle[0][0];    dp[1][0] = triangle[1][0], dp[1][1] = triangle[0][0]+triangle[1][1];    if(n==2) return dp[1][1];    for(int i=2; i<n; i++)    {        dp[i][0] = dp[i-1][1] + triangle[i][0];        for(int j=1; j<=i-2; j++)        {            dp[i][j] = max(dp[i-1][j-1], dp[i-1][j+1]) + triangle[i][j];        }        dp[i][i] = dp[i-1][i-1] + triangle[i][i];        dp[i][i-1] = dp[i-1][i-2] + triangle[i][i-1];    }    cout<<endl<<endl<<"DP数组更新为:"<<endl;    for(const auto x:dp)    {        for(const int y:x) cout<<y<<" ";        cout<<endl;    }    return *max_element(dp[n-1].begin(), dp[n-1].end());}// 看成等腰三角形int maximumTotal(vector<vector<int>> &triangle){    int n = triangle.size();    vector<vector<int>> dp(n, vector<int>(n,0));    dp[0][0] = triangle[0][0];    for(int i=1; i<n; i++)    {        dp[i][0] = dp[i-1][0] + triangle[i][0];        for(int j=1; j<n-1; j++)         {            dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j];        }        dp[i][i] = dp[i-1][i-1] + triangle[i][i];    }    return *max_element(dp[n-1].begin(), dp[n-1].end());}int main(){    int n;    cin>>n;    vector<vector<int>> triangle(n, vector<int>(n));    for(int i=0; i<n; i++)    {        for(int j=0; j<=i; j++)            cin>>triangle[i][j];    }    cout<<maximumTotal(triangle)<<endl;    system("pause");    return 0;}

D.跳跃游戏Ⅱ

// D.跳跃游戏Ⅱ // LeetCode第45题// 贪婪算法#include<bits/stdc++.h>using namespace std;// 思维就一句话:每次在上次能跳到的范畴(end)内抉择一个能跳的最远的地位(也就是能跳到max_far地位的点)作为下次的起跳点 !int Jump(vector<int> &nums){    int n = nums.size();    int max_far = 0;  //目前可能跳到的最远地位    int step = 0;    int end = 0;  //上次跳跃可达到的范畴右边界    for(int i=0; i<n-1; i++)   //<n-1,最初一个元素不必遍历.    {        max_far = max(i+nums[i], max_far);        if(i == end)        {            end = max_far;            step++;        }    }    return step;}int main(){    int n;    cin>>n;     vector<int> nums(n);    for(int i=0; i<n; i++) cin>>nums[i];    cout<<Jump(nums)<<endl;    system("pause");    return 0;}

E.字母排序

// E.字母排序// 最长不降子序列#include<bits/stdc++.h>using namespace std;// 1.LIS ---> LCS  最长递增子序列(排序+LCS)// const int N = 1010;// int DP[N][N];// int DIR[N][N];// int LCS_Length(string a, string b)// {//     int m = a.size();//     int n = b.size();//     for(int i=1; i<=m; i++)//     {//         for(int j=1; j<=n; j++)//         {//             if(a[i-1] == b[j-1])//             {//                 DP[i][j] = DP[i-1][j-1] + 1;//                 DIR[i][j] = 1;//             }//             else if(DP[i-1][j] > DP[i][j-1])//             {//                 DP[i][j] = DP[i-1][j];//                 DIR[i][j] = 2;//             }//             else //             {//                 DP[i][j] = DP[i][j-1];//                 DIR[i][j] = 3;//             }//         }//     }//     return DP[m][n];// }// void LCS(string a, int i, int j)// {//     if(i==0 || j==0) return;//     if(DIR[i][j] == 1)//     {//         LCS(a, i-1, j-1);//         cout<<a[i-1];//     }//     else if(DIR[i][j] == 2) LCS(a, i-1, j);//     else if(DIR[i][j] == 3) LCS(a, i, j-1);// }// string RD(string b, int &add)  //去重函数  hhh变为h// {//     bool Flag[b.size()] = {false};//     for(int i=1; i<b.size(); i++)//     {//         if(b[i] == b[i-1]) //         {//             add++;//             Flag[i] = true;//         }//     }//     for(int i=0; i<b.size(); i++)//     {//         if(Flag[i] == 1) b[i] = '.';//     }//     // cout<<b<<endl;//     b.erase(std::remove(b.begin(), b.end(), '.'), b.end());  //去重操作//     return b;// }// int LIS_Length(string a, string b)// {//     return LCS_Length(a, b);// }// int main()// {//     string a, str;//     cin>>a;//     cin.ignore();   //空格//     getline(cin, str);//     str += ' ';//     string b;//     int Start_pos = 0;//     int add = 0;//     for(int i=0; i<str.size(); i++)//     {//         if(str[i] == ' ')//         {//             // cout<<"Flag"<<i<<endl;//             b = str.substr(Start_pos, i-Start_pos);//             // cout<<b<<endl;//             RD(b, add);//             cout<<LIS_Length(a, b)+add;//             Start_pos = i+1;//             add = 0;//         }//     }//     // string test;//     // cin>>test;//     // int add = 0;//     // cout<<RD(test, add)<<" "<<add<<endl;//     // cout<<test<<endl;//     system("pause");//     return 0;// }// 2.DP// O(n^2)// int LengthOfLIS(vector<int> &nums)// {//     int n = nums.size();//     if(n==0) return 0;//     vector<int> dp(n, 1);//     for(int i=0; i<n; i++)//     {//         for(int j=0; j<i; j++)//         {//             if(nums[i] > nums[j])//             {//                 dp[i] = max(dp[j]+1, dp[i]);//             }//         }//     }//     return *max_element(dp.begin(), dp.end());// }// int main()// {//     int n;//     while(scanf("%d", &n) && n)//     {//         vector<int> nums(n);//         for(int i=0; i<n; i++) scanf("%d", &nums[i]);//         cout<<LengthOfLIS(nums)<<endl;//     }//     system("pause");//     return 0;// }// 3.贪婪 + 二分查找// 保护一个一维数组B,并且这个数组是动静扩大的,初始大小为1,//B[i]示意最长回升子序列长度是i的所有子串中开端最小的那个数,依据这个数字,咱们能够比拟晓得,//只有以后考查的这个数比B[i]大,那么以后这个数肯定能通过B[i]形成一个长度为i+1的回升子序列。//如果以后考查的数并没有数组尾部的B[i]大,那么咱们抉择在B数组中找到第一个大于以后考查数的元素,并且更换.// 正确!!!int BinarySearch(vector<int> &nums, int l, int r, int target)   //在nums数组中找到第一个大于target的数,而后更新它{    if(l == r) return l;    int mid;    while(l <= r)    {        mid = (l+r)/2;        if(nums[mid] == target) return mid;  //return mid!        else if(nums[mid] > target) r = mid-1;        else l = mid+1;    }    return l;}int LengthOfLIS(vector<int> &nums){    int n = nums.size();    vector<int> B(n+1);    B[0] = 0;    B[1] = nums[0];    int len = 1; //示意B数组的长度    for(int i=1; i<n; i++)    {        if(nums[i] > B[len])        {            B[++len] = nums[i];         }        else if(nums[i] < B[len])        {            int pos = BinarySearch(B, 1, len, nums[i]);  //在B数组中找到第一个大于nums[i]的元素地位            cout<<pos<<" "<<i<<" "<<nums[i]<<endl;            B[pos] = nums[i];        }    }    for(const int x:B) cout<<x<<" ";    cout<<endl;    return len;}// 力扣! https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/zui-chang-shang-sheng-zi-xu-lie-by-leetcode-soluti/// 思考一个简略的贪婪,如果咱们要使回升子序列尽可能的长,则咱们须要让序列回升得尽可能慢,因而咱们心愿每次在回升子序列最初加上的那个数尽可能的小。// 咱们顺次遍历数组 nums 中的每个元素,并更新数组 d 和 len 的值。如果nums[j] > d[len] 则更新 len = len + 1// 否则在 d[1...len] 中 找到 d[i-1] < nums[j] <  d[i]的pos值,而后更新d[i] = nums[j]int lengthOfLIS(vector<int> &nums){    int len = 1, n = int(nums.size());    if(n == 0) return 0;    vector<int> d(n+1, 0);    d[len] = nums[0];    for(int i=1; i<n; ++i)    {        if(nums[i] > d[len])            d[++len] = nums[i];        else        {            int l = 1, r = len, pos = 0;        //如果找不到阐明所有的数都比nums[i]大,此时要更新d[1]            while(l <= r)            {                int mid = (l+r) >> 1;                if(d[mid] < nums[i])                {                    pos = mid;                    l = mid+1;                }                else r = mid-1;            }            d[pos+1] = nums[i];        }    }    return len;}int main(){    int t;    cin>>t;    while(t--)    {        int n;        cin>>n;        vector<int> nums(n);        for(int i=0; i<n; i++)            cin>>nums[i];        cout<<LengthOfLIS(nums)<<endl;    }    system("pause");    return 0;}

3.Contest2453 - 毕老师算法试验三

传送门在这里
题目总览:

A.Homework

// D.Homework// 正确!#include<bits/stdc++.h>using namespace std;bool cmp(pair<double, double> a, pair<double, double> b){    return a.second/a.first > b.second/b.first;}int main(){    int M, N;    while(scanf("%d%d", &M, &N) && (M && N))    {        vector<pair<double, double>> vec;        double time, value;        for(int i=0; i<M; ++i)        {            scanf("%lf%lf", &time, &value);            vec.push_back(pair<double, double>(time, value));        }           sort(vec.begin(), vec.end(), cmp);        double TimeTotal = N;        double ValueTotal = 0;   //double类型,如果写为int类型答案谬误        for(const auto x:vec) cout<<"("<<x.first<<","<<x.second<<")"<<endl;        for(const pair<double, double> x:vec)        {            if(TimeTotal-x.first >= 0)            {                cout<<"Flag1"<<endl;                ValueTotal += x.second;                TimeTotal -= x.first;            }            else             {                ValueTotal += TimeTotal * x.second/x.first;                break;            }        }        printf("%.2lf\n", ValueTotal);    }    system("pause");    return 0;}

B.区间蕴含问题

// E.区间蕴含问题// 贪婪算法  相似于流动安顿问题#include<bits/stdc++.h>using namespace std;const int maxn = 10010;struct Node{    int left, right;}node[maxn];bool cmp(Node a, Node b){    return a.right < b.right;}int main(){    int n, m;    scanf("%d %d", &n, &m);    for(int i=0; i<n; ++i)     {        scanf("%d %d", &node[i].left, &node[i].right);        // node[i].right++;    }    sort(node, node+n, cmp);    int l, r;    for(int i=0; i<m; ++i)     {        scanf("%d %d", &l, &r);        int pos = l, ans = 0;        for(int j=0; j<n; ++j)        {            if(node[j].left>=pos && node[j].right<=r)            {                cout<<l<<" "<<r<<endl;                cout<<j<<" "<<node[j].left<<" "<<node[j].right<<endl;                ans++;                pos = node[j].right;            }        }        printf("%d\n", ans);    }    system("pause");    return 0;}

C.最长子序列

// F.最长子序列(最大子段和)#include<bits/stdc++.h>using namespace std;// 1.递归分治法// f(i) = max(f(i-1)+nums[i], nums[i])  思考f(i-1)带来的是正能量还是负能量// f(i) 代表以第 i 个数结尾的「间断子数组的最大和」,那么很显然咱们要求的答案就是:// max(0-i-1){f[i]}int maxSubArray(vector<int> &nums){    int n = nums.size();    if(n==0) return {};    if(n==1) return nums[0];    vector<int> f(n);    f[0] = nums[0];    for(int i=1; i<n; ++i)    {        f[i] = max(f[i-1]+nums[i], nums[i]);    }     for(const int x:f) cout<<x<<" ";    cout<<endl;    return *max_element(f.begin(), f.end());  //记住不是返回f[n-1]}int maxSubArray2(vector<int> &nums){    int n = nums.size();    if(n==0) return {};    int pre = 0, maxAns = nums[0];    for(const int  x:nums)    {        pre = max(pre+x, x);  //pre记录以后x后面的间断子数组的最大和,即f[i-1],不断更新. 相似于滚动数组         maxAns = max(maxAns, pre);    }    return maxAns;}int main(){    int n;    while(~scanf("%d", &n))    {        vector<int> nums(n);        for(int i=0; i<n; ++i) scanf("%d", &nums[i]);        cout<<maxSubArray(nums)<<endl;    }    system("pause");    return 0;}

D.三值排序

// D.三值排序#include<bits/stdc++.h>using namespace std;int ThreeSort(vector<int> &nums){    int n = nums.size();    int a=0, b=0, c=0;    for(int i=0; i<n; ++i)    {        if(nums[i]==1) a++;        else if(nums[i]==2) b++;        else if(nums[i]==3) c++;     }    int dif[4][4] = {0};    for(int i=0; i<a; i++)         if(nums[i] != 1) dif[1][nums[i]]++;    for(int i=a; i<a+b; i++)        if(nums[i] != 2) dif[2][nums[i]]++;    for(int i=a+b; i<n; i++)        if(nums[i] != 3) dif[3][nums[i]]++;    int ans = 0, sum = 0;    for(int i=1; i<4; i++)    {        for(int j=i+1; j<4; j++)        {            if(dif[i][j] <= dif[j][i])            {                ans += dif[i][j];                sum += dif[j][i] - dif[i][j];             }            else            {                ans += dif[j][i];                sum += dif[i][j] - dif[j][i];            }        }    }    ans = ans + sum/3*2;  //三个数字都不在本人该在的地位,然而只须要两步就能变得有序:213变为123只需两步  312 132等等同样    return ans;}int main(){    int n;    cin>>n;    vector<int> nums(n);    int a=0, b=0, c=0;    for(int i=0; i<n; ++i)         scanf("%d", &nums[i]);    cout<<ThreeSort(nums)<<endl;    system("pause");    return 0;}

E.法师康的工人

// E.法师康的工人// 这一题有点问题,我如同没改过来#include<bits/stdc++.h>using namespace std;bool cmp(pair<int, int> a, pair<int, int> b){    return a.second < b.second;}int main(){    int n;    cin>>n;    vector<pair<int, int>> vec;    int left, right;    for(int i=0; i<n; ++i)    {        scanf("%d%d", &left, &right);        vec.push_back(pair<int, int>(left, right));    }    sort(vec.begin(), vec.end(), cmp);    int left_border = vec[0].first;    int right_border = vec[0].second;    int max_ContinuousLength = right_border-left_border;    int max_IntervalLength = 0;    for(int i=1; i<n; ++i)    {        if(vec[i].first <= right_border)        {            right_border = max(right_border, vec[i].second);            left_border = min(left_border, vec[i].first);        }            else        {            max_ContinuousLength = max(max_ContinuousLength, right_border-left_border);            max_IntervalLength = max(max_IntervalLength, vec[i].first-right_border);            left_border = vec[i].first;  //呈现距离,重置边界            right_border = vec[i].second;        }    }    max_ContinuousLength = max(max_ContinuousLength, right_border-left_border);    // 避免 2 (100 500)  (400 900)这种没有间断的状况呈现,间接跳出循环的话      cout<<max_ContinuousLength<<" "<<max_IntervalLength<<endl;    system("pause");    return 0;}// 10// 2 3// 4 5// 6 7// 8 9// 10 11// 12 13// 14 15// 16 17// 18 19// 1 20// 19 1// 请按任意键持续. . .// 正确答案:19 0    谬误的起因?咋改

4.Contest2462 - 毕老师算法试验四

传送门在这里
题目总览:

A.凯撒加密法

// A.ż­ČöĂÜÂë#include<bits/stdc++.h>using namespace std;string CaesarCipher(string ciphertext, int n){    int length = ciphertext.size();    for(int i=0; i<length; ++i)    {        if(isupper(ciphertext[i]))            ciphertext[i] = 'A' + (ciphertext[i]-'A'-n+26)%26;        else if(islower(ciphertext[i]))            ciphertext[i] = 'a' + (ciphertext[i]-'a'-n+26)%26;    }    return ciphertext;}int main(){    int T;    scanf("%d", &T);    // for(int i=0; i<T; ++i)    // {    //     string ciphertext;    //     // cin>>ciphertext;    //     cin.ignore();    //     getline(cin, ciphertext);    //     int k;    //     cin>>k;    //     k = k%26;    //     cout<<CaesarCipher(ciphertext, k)<<endl;    // }    string str[T];    int change[T];    for(int i=0; i<T; ++i)    {        cin>>str[i];        cin>>change[i];        change[i] %= 26;    }    for(int i=0; i<T; i++)    {        cout<<CaesarCipher(str[i], change[i])<<endl;    }    system("pause");    return 0;}

B.维吉尼亚明码

// B.¸ĽźŞÄáŃÇĂÜÂë#include<bits/stdc++.h>using namespace std;string fill(string key, string plainText){    int len1 = key.size();    int len2 = plainText.size();    if(len1 < len2)     {        int num = len2 - len1;        string temp = key;        for(int i=0; i<num; ++i)        {            key += temp[i%len1];        }    }    for(int i=0; i<len2; ++i)    {        if(islower(key[i]))            key[i] -= 32;    }    return key;}int main(){    string key, cipherText;    cin>>key>>cipherText;    key = fill(key, cipherText);    // cout<<key<<endl;    int len = cipherText.size();    string plainText;    int change;    for(int i=0; i<len; ++i)    {        change = key[i] - 'A';        // cout<<i<<": "<<change<<endl;        if(isupper(cipherText[i]))            plainText.push_back('A' + (cipherText[i]-'A'- change + 26)%26);        else            plainText.push_back('a' + (cipherText[i]-'a'- change + 26)%26);    }    cout<<plainText<<endl;    system("pause");    return 0;}

C.简略的明码

#include<bits/stdc++.h>using namespace std;int main(){    int n;    int f[35] = {0, 0, 0, 1};    for(int i=4; i<=30; ++i)        f[i] = f[i-1]*2 + pow(2, i-4) - f[i-4];    while(cin>>n && n>=1 && n<=30)        cout<<f[n]<<endl;    system("pause");    return 0;}

D.乏味的素数

// 带佬代码#include<iostream>#include<stdio.h>#include<string.h>using namespace std;int n,ans,last;bool visited[32];bool isPrime[40]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0};void pc(int cur){    if(cur == n && isPrime[1+last])    {        ans++;        return;    }    for(int i = 2; i <= n; i++)    {        if(!visited[i] && isPrime[last+i])        {            int t = last;            last = i;            visited[i] = true;            pc(cur+1);            visited[i] = false;            last = t;        }    }}int main(){    while(~scanf("%d",&n))    {        memset(visited,0,sizeof(visited));        ans = 0;        last = 1;        pc(1);        printf("%d\n",ans);    }    return 0;}

E.数据加密

// E.数据加密#include<bits/stdc++.h>using namespace std;string CipherCompute(string PlainText){    int n = PlainText.size();    string ans;    if(n==0) return {};    if(n==1) return PlainText;    int left = 0, right = n-1;    while(n>0)    {        if(PlainText[left] < PlainText[right])        {            ans += PlainText[left];            left++;            n--;        }        else if(PlainText[left] > PlainText[right])        {            ans += PlainText[right];            right--;            n--;        }        else         {            int temp_left = left+1, temp_right = right-1;            while(temp_left<n && temp_right>=0 && temp_left <= temp_right && PlainText[temp_left] == PlainText[temp_right])            {                temp_left++;                temp_right--;            }             if(PlainText[temp_left]>PlainText[temp_right])            {                ans += PlainText[right];                right--;                n--;            }            else            {                ans += PlainText[left];                left++;                n--;            }         }    }    return ans;}int main(){    int t;    cin>>t;    while(t--)    {        int n;        cin>>n;        string PlainText;        cin>>PlainText;        string Cipher = CipherCompute(PlainText);        cout<<Cipher<<endl;    }    system("pause");    return 0;}// 带佬代码#include<iostream>#include<stdio.h>#include<string.h>using namespace std;int main(){    int n;    char str[2005],ans[2005];    while(~scanf("%d",&n))    {        scanf("%s",str);        int i = 0,j = n-1;        while(i <= j)        {            bool flag = false;            for(int k = 0; i+k < j-k; k++)            {                 if(str[i+k] < str[j-k])                {                    flag = true;                    break;                }                if(str[i+k] > str[j-k]) break;            }            if(flag) printf("%c",str[i++]);            else printf("%c",str[j--]);        }        printf("\n");    }    return 0;}


(~ ̄▽ ̄)~
如果大家感觉本篇文章对本人有所帮忙的话,无妨去我的集体博客---乔治的编程小屋逛逛吧.