第12章

A1037

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

/*
    总的思路:将两个数组先按照降序排列,分别 按照 整数 和 负数 分开到 a1,b1,a2,b2  然后再 用 双指针 对应 相乘,其中 正数部分从 数组头开始,而负数 部分 从 数组 尾 开始
*/

vector<int> a,b,a1,b1,a2,b2;

int n,m;

bool cmp(int a,int b)
{
    
    
    return a>b;
}

int main()
{
    
    
    cin >> n;
    int temp;
    for(int i=0; i<n; i++)
    {
    
    
        cin >> temp;
        a.push_back(temp);
    }
    cin >> m;
    for(int i=0; i<m; i++)
    {
    
    
        cin >> temp;
        b.push_back(temp);
    }
    sort(a.begin(),a.end(),cmp);
    sort(b.begin(),b.end(),cmp);
    for(int i=0; i<n; i++)
    {
    
    
        if(a[i]>0)
            a1.push_back(a[i]);
        else
        {
    
    
            a2.push_back(a[i]);
        }
    }
    for(int i=0; i<m; i++)
    {
    
    
        if(b[i]>0)
            b1.push_back(b[i]);
        else
            b2.push_back(b[i]);
    }


    int sum=0;
    for(int i=0,j=0; i<a1.size() && j<b1.size(); i++,j++)
        sum+=a1[i]*b1[j];
    for(int i=a2.size()-1,j=b2.size()-1; i>=0 && j>=0; i--,j--)
    {
    
    
        sum+=a2[i]*b2[j];
    }
    cout << sum;
    return 0;
}

A1038

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

//这道题 涉及 复杂的数学 证明 所以 这道题 记住 解答 思路 , 如果 后面 遇到 类似的 拼凑  字符串  寻找 最大 最小的 就用这方法

const int maxn=10011;

string ai[maxn];

int n;

bool cmp(string a, string b)
{
    
    
    return a+b<b+a;                      //这个 就是 那个 定理  如果 字符串 a,b      a<=b <==> ab<=ba 就是这个定理
}

int main()
{
    
    
    cin >> n;
    for(int i=0; i<n; i++)
    {
    
    
        cin >> ai[i];
    }

    sort(ai,ai+n,cmp);          //对字符串数组ai进行排序

    string res;

    for(int i=0; i<n; i++)            //将排好序的数组 累加到 res,此时这个res就是最小的解
        res+=ai[i];

    //下来 要 处理 掉 res字符串的开头的0

    int k=0;
    while(k+1<res.size() && res[k]=='0')          //其中设置 k+1<res.size()是因为 如果 最后 结果 只有 1个 0,那么不能删除 需要保留
        k++;

    cout << res.substr(k);

    return 0;
}

A1067

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

#include <iostream>
#include <cstring>
#include<cstdio>

using namespace std;

const int N = 100010;

int n;
int p[N];

//所有数字,就是从0--n-1的

int main()
{
    
    
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
    
    
        int id;
        scanf("%d", &id);
        p[id] = i;
    }

    int res = 0;      //res表示一共的步骤
    for (int i = 1; i < n;)
    {
    
    
        while (p[0]!=0) swap(p[0], p[p[0]]),res ++ ;    //消去0所在的大环,变成单个的独环
        while (i < n && p[i] == i)      //遍历所有的数字,找出不是独环的数字
            i ++ ;
        if (i < n) swap(p[0], p[i]), res ++ ;   //将0与该数字交换,合并成一个大环
    }

    printf("%d\n", res);

    return 0;
}

A1070

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;

int n;
double need;         //need设置为double 是 因为 后面 用不完 所有的 量,进行除法时需要的

const int maxn=1010;

struct node
{
    
    
    double liang;        //这里 这个 值 也设置 为 double
    double profit;
}Node[maxn];

bool cmp(node a, node b)
{
    
    
    return a.profit/a.liang>b.profit/b.liang;
}

int main()
{
    
    
    cin >> n >> need;

    for(int i=0; i<n; i++)
        cin >> Node[i].liang;

    for(int i=0; i<n; i++)
        cin >> Node[i].profit;

    sort(Node,Node+n,cmp);

    double res=0;


    for(int i=0; i<n && need>0; i++)     //注意要 使用 && 符号
    {
    
    
        double r=min(need,Node[i].liang);        //r表示 所 选取的 量
        need-=r;
        res+=r*Node[i].profit/Node[i].liang;
    }


    printf("%.2f",res);       //注意保留2位小数

    return 0;
}

A1113

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

const int maxn=100010;

vector<int> a;

int n;

bool cmp(int a,int b)
{
    
    
    return a<b;
}

int main()
{
    
    
    cin >> n;
    int temp;
    for(int i=0; i<n; i++)
    {
    
    
        cin >> temp;
        a.push_back(temp);
    }
    sort(a.begin(),a.end(),cmp);

    if(n%2==0)
        cout << 0;
    else
        cout << 1;

    cout << " ";

    int first1=0,first2=0;

    for(int i=0; i<a.size()/2; i++)
        first1+=a[i];

    for(int i=a.size()/2; i<a.size(); i++)
        first2+=a[i];

    cout << first2-first1;
    return 0;
}

A1125

ここに画像の説明を挿入

#include<iostream>
#include<algorithm>

using namespace std;

const int maxn=10010;

int n;

double shenzi[maxn];

int main()
{
    
    
    cin >> n;
    for(int i=0; i<n; i++)
        cin >> shenzi[i];

    sort(shenzi,shenzi+n);

    for(int i=1; i<n; i++)
        shenzi[0]=(shenzi[0]+shenzi[i])/2;

    cout << (int)shenzi[0];
    return 0;
}

A1033

ここに画像の説明を挿入


#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

const int N=510;               //这个表示 加油站  的 最大数量


struct node
{
    
    
    double p,d;            //每个 加油站 到达 起点 距离 和 油的单价
}s[N];

int c_max,d,d_avg,n;

bool cmp(node a, node b)
{
    
    
    return a.d<b.d;
}

int main()
{
    
    
    cin >> c_max >> d >> d_avg >> n;

    for(int i=0; i<n; i++)
    {
    
    
        cin >> s[i].p >> s[i].d;
    }

    s[n].p=0;        //这道题 最核心 的 思路 是去 找 下一个 最合适的 加油站,如果 到达 目的地 之前的 某一个加油站,如果 再将 目的地 也是设置为一个加油站(单价为0),这个加油站的单价 一定是 最小的, 所以 此时 加油,就是刚好 到达下一个加油站 也就是 终点
    s[n].d=(double)d;

    sort(s,s+n+1,cmp);                      //需要  按照 到 杭州的 距离  升序 排列,注意将 终点 改为 最后 一个 加油站,所以 也要在 排序之内


    if(s[0].d)
    {
    
    
        cout << "The maximum travel distance =0 .00";
        return 0;
    }

    double res=0,oil=0;           //res表示总的加油的钱,oil表示当前油箱内的油
    for(int i=0; i<n; )           //这个i表示 当前 所处 的  加油站
    {
    
    
        int k=-1;          //k表示 下一个 加油站

        for (int j = i + 1; j <= n && s[j].d - s[i].d <= c_max * d_avg; j ++)       //j去遍历 范围内的所有加油站
            if (s[j].p < s[i].p)
            {
    
    
                k = j;
                break;
            }
            else if (k == -1 || s[j].p < s[k].p)                  //k表示 下一个 加油站
                k = j;

        if(k == -1)          //表示 在 范围内 没有 加油站,也就是 到达 不了 终点
        {
    
    
             printf("The maximum travel distance = %.2lf\n",s[i].d+(double)c_max*d_avg);
             return 0;
        }


        if(s[i].p>=s[k].p)       //在范围内,某个加油站的单价小于当前加油站的单价,则加的油 只要 能 当好 到达 下一个 加油站 即可
        {
    
    
            res+=((s[k].d-s[i].d)/d_avg-oil)*s[i].p;
            i=k;
            oil=0;
        }
        else             //需要 将 油 加满
        {
    
    
            res+=(c_max-oil)*s[i].p;

            oil=c_max-(s[k].d-s[i].d)/d_avg;
                        i=k;
        }

    }

    printf("%.2lf\n",res);
    return 0;
}

おすすめ

転載: blog.csdn.net/wsfhdhjs/article/details/112577066