计蒜客第二场

1、给出2个序列A={a[1],a[2],…,a[n]},B={b[1],b[2],…,b[n]},从A、B中各选出n个元素进行一一配对(可以不按照原来在序列中的顺序),并使得所有配对元素差的绝对值之和最大。  输入格式:  输入的第1行为1个整数n 第2行包含n个整数,题目中的A序列。  第3行包含n个整数,题目中的B序列。   输出格式:  一个数,最大配对  3与6配对,2与7配对,5与4配对,6与1配对,绝对值之差和为14 对于10%的数据,有n≤20;  对于30%的数据,有n≤100;  对于50%的数据,有n≤1000;  对于100%的数据,有n≤10000;a[i],b[i]≤1000。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[10000],b[10000];
int n;
int main()
{
    while(scanf("%d",&n)==1)
    {
        for(int i=0;i<n;i++) scanf("%d",&a[i]);sort(a,a+n);
        for(int i=0;i<n;i++) scanf("%d",&b[i]);sort(b,b+n);
        int cnt=0;
        for(int i=0,j=n-1;i<n;i++,j--)
        {
            cnt+=a[i]-b[j]>0?a[i]-b[j]:b[j]-a[i];
        }
        printf("%d/n",cnt);
    }
    return 0;
}

2、给定一个数组和一个数(该数不一定在数组中),从数组里删掉这个数字,返回剩下的数组长度。

 如:A[] = {1, 2, 3, 4, 5}, 要删除数字3, 那么返回数组长度为4.

#include"iostream"
#define MAX 10000
using namespace std;
int main()
{
    int n, a[MAX], elem, ans;
    cin >> n;
    for (int i = 0; i<n; i++)
        scanf("%d", &a[i]);

    cin >> elem;
    ans = n;

    for (int i = 0; i<n; i++)
    {
        if (a[i] == elem)
        {
            ans--;
        }
    }

    cout << ans;

}

 3、有一个奇怪的国家,里面的国民对于事情的态度永远只有两面。当两个人遇到一起讨论一个事情的时候——两个持赞同观点的人遇到一起后会对这个事情都继续赞同;一个持赞同观点的人遇到一个持不赞同观点的人的时候,两人都会不再继续赞同;两个持不赞同观点的人遇到一起讨论后反而会对这个事情开始赞同。

#include<iostream>
#include<string.h>
using namespace std;
int main(){
    char a[50],b[50];
    cin>>a;
    cin>>b;
    int c=strlen(a);
    for(int i=0;i<c;i++){
        if(a[i]==b[i])
            cout<<"1";
        else
            cout<<"0";
    }
    cout<<endl;
    return 0;
}

 4、

给定一个罗马数字s,( I<=s<=MMMCMXCIX)(即1到3999),将罗马数字转换成整数。

如罗马数字I,II,III,IV,V分别代表数字1, 2, 3, 4, 5。
格式:
   第一行输入一个罗马数字,接下来输出对应的整数。
提示:
   首先要来了解一下罗马数字表示法,基本字符有7个:I,V,X,L,C,D,M,分别表示1,5,10,50,100,500,1000。
在构成数字的时候,有下列规则:
1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
4、正常使用时,连写的数字重复不得超过三次。
样例1
输入:
CXXIII
输出:

123

#include<stdio.h>
#include<string.h>
 
int main(int argc, char **argv)
{
    char s[100];
    int i,len,count=0;
    scanf("%s",&s);
    len= strlen(s);
    for(i=0;i<len;i++)
    {
        switch(s[i])
        {
        case 'M':
            count+=1000;
            break;
        case 'D':
            count+=500;
            break;
        case 'C':
            if(s[i+1]=='D'||s[i+1]=='M')
                count-=100;
            else
                count+=100;
            break;
        case 'L':
            count+=50;
            break;
        case 'X':
            if(s[i+1]=='L'||s[i+1]=='C')
                count-=10;
            else
                count+=10;
            break;
        case 'V':
            count+=5;
            break;
        case 'I':
            if(s[i+1]=='V'||s[i+1]=='X')
                count--;
            else
                count++;
            break;
        default:
            printf("error!\n");
        }
    }
 
    printf("%d\n",count);
    return 0;
}

4、晓萌最近在做一个翻转图片的应用,你可能也知道,图片其实是由一个个的点组成的。于是,晓萌想先做一个可以翻转矩阵的程序,来解决他问题的核心部分。
输入第一行包括由空格分开的整数M、N、T(0 < M < 200,0 < N < 200,T=0或1),其中M和N分别表示待处理矩阵的行数与列数,T为0时表示左右翻转,为1时表示上下翻转。
  之后的M行,每行包括由空格分隔的N个整数,依次为输入矩阵的每一行的数据。
  输出包括M行N列,每个数字之间用一个空格分隔,每一行行末均有一个空格,表示的是按照要求翻转后的矩阵。

#include <stdio.h>
int main()
{
    int M,N,T;
    int i,j;
    scanf("%d %d %d",&M,&N,&T);
    int arr[200][200];
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
 
    if(0==T)
    {
        for(i=0;i<M;i++)
        {
            for(j=N-1;j>=0;j--)
            {
                printf("%d ",arr[i][j]);
            }
            printf("\n");
        }
    }
    if(1==T)
    {
        for(i=M-1;i>=0;i--)
        {
            for(j=0;j<N;j++)
            {
                printf("%d ",arr[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

5、

到了旱季农业生产的灌溉就成了一个大问题。为了保证灌溉的顺利,某县政府决定投资为各个村之间建立灌溉管道。

输入第1行包括一个整数N,表示某县的村庄的数量。(3≤N≤100),第2行-结尾为一个N×N的矩阵,表示每个村庄之间的距离。虽然在理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们限制在80个字符,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为不会有线路从第i个村到它本身(任何两个村之间的距离都不大于100000)。

输出只有一个,为修建灌溉管道将所有村庄相连在一个灌溉系统里所需的最小管道长度。

样例输入


0 4 9 21 
4 0 8 17 
9 8 0 16 
21 17 16 0 
样例输出

28

【思路分析】裸的最小生成树。 

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

struct node
{
    int u,v,cost;
}p[10005];

int pre[105];
int fin(int x)
{
    if(x==pre[x])
    {
        return x;
    }
    else
    {
        return pre[x]=fin(pre[x]);
    }
}

void join(int x,int y)
{
    int t1=fin(x);
    int t2=fin(y);
    if(t1!=t2)
    {
        pre[t1]=t2;
    }
}

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

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<=n;i++)
        {
            pre[i]=i;
        }
        int num,sum=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                scanf("%d",&num);
                if(i!=j)
                {
                    p[sum].u=i;
                    p[sum].v=j;
                    p[sum++].cost=num;
                }
            }
        }
        sort(p,p+sum,cmp);
        int re=0,ss=0;
        for(int i=0;i<sum;i++)
        {
            if(fin(p[i].u)!=fin(p[i].v))
            {
                join(p[i].u,p[i].v);
                ss++;
                re+=p[i].cost;
            }
            if(ss==n-1)
            {
                break;
            }
        }
        printf("%d\n",re);
    }
    return 0;
}

 

猜你喜欢

转载自www.cnblogs.com/geziyu/p/9644428.html
今日推荐