CodeForse#204(Div.2) 总结 A,B,C

A题:

给出一个数列,由0或者5组成,求这里面由0或者5所能组成的数里面,能被90整除的数的最大值。



AC代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
    int n;
    while(scanf("%d", &n)!=EOF) {
        int tmp, cnt0 = 0, cnt5 = 0;
        for(int i = 1; i <= n; i++) {
            scanf("%d", &tmp);
            if(tmp == 0)
                cnt0++;
            else
                cnt5++;
        }
        if(cnt0 == 0)
            printf("-1\n");
        else if(cnt5 < 9)
            printf("0\n");
        else {
            for(int i = 1; i <= (cnt5/9)*9; i++)
                printf("5");
            for(int i = 1; i <= cnt0; i++)
                printf("0");
        }
        puts("");
    }
    return 0;
}



B题:

给出一个数列,求在相同位置上所能满足等差数列的条件的值和差值。


AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
const int maxn=100100;
int flag[maxn]; 
int t[maxn];    
struct node
{
    int c; 
    int d;
    bool flag;
}D[maxn];

int main()
{
    int n,x,len=0;
    cin>>n;
    memset(D,0,sizeof(D));
    memset(flag,0,sizeof(flag));
    memset(t,0,sizeof(t));
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(!flag[x])
        {
            t[len++]=x;
            flag[x]=1;
            D[x].c=i;
            D[x].d=0;
            D[x].flag=false;
        }
        else
        {
            if(D[x].d==0)
            {
                D[x].d=i-D[x].c;
                D[x].c=i;
            }
            else
            {
                if(i-D[x].c==D[x].d)    D[x].c=i;
                else    D[x].flag=true;
            }
        }
    }
    sort(t,t+len);
    //cout<<len<<endl;
    int ans=0;
    for(int i=0;i<len;i++)
    {
        int xx=t[i];
        if(!D[xx].flag) ans++;
    }
    cout<<ans<<endl;
    for(int i=0;i<len;i++)
    {
        int xx=t[i];
        if(!D[xx].flag)
            printf("%d %d\n",xx,D[xx].d);
    }
    return 0;
}



C题:

给予N*2个数字,改变其中的N个向上进位,N个向下进位,使最后得到得数与原来数的差的绝对值最小。

考虑小数点后面的数字,如果这些数都非零,则就是  abs(原数小数部分相加-1*n), 多一个0 则 min( abs(原数小数部分相加-1*n) ,abs(原数小数部分相加-1*(n-1)) )



AC代码:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>

#define INF 0x7fffffff;

using namespace std;

int main() {
    int n;
    scanf("%d", &n);
    int x, len = 0, sum = 0;
    for(int i = 0; i < n*2; i++) {
        scanf("%*d.%d", &x);
        sum += x;
        if(x == 0)
            len++;
    }
    int ans = INF;
    for(int i = 0; i <= len; i++)
        ans = min(ans, abs(sum - (1000*n - 1000*i)));
    printf("%d.%03d\n", ans/1000, ans%1000);
    return 0;
}


你可能感兴趣的:(CodeForse#204(Div.2) 总结 A,B,C)