USACO 1.3章题解

1.3.1 Milking Cows

排序+贪心即可,话说这题我还冒泡了,n=5000尚可,再大点在OJ模式下目测就要TLE了,下次再写类似题时切记用结构体排序。。。

 

1.3.2 bran1

这题需要求最小覆盖长度,在已知总长度的情况下,减去最大未覆盖长度(即最大的m-1个间隙之和),但是做的时候没考虑到木板数目大于牛的数目的情况,看了题解后才发现在这种情况下则不会有间隙会被全部挡住,另外其实输入的牛的位置是无序的,所以需要快排

 

 

#include<cstdio>  
#include<algorithm>  
using namespace std;
int main()  
{  
    int i,n,m,k,s,t=0,a[201],b[201];  
    freopen("barn1.in","r",stdin);  
    freopen("barn1.out","w",stdout);  
    scanf("%d%d%d",&m,&s,&n);  
    for(i=1;i<=n;i++)  
    scanf("%d",&a[i]);  
    sort(a+1,a+n+1);  
    for(i=1;i<n;i++)  
    b[i]=a[i+1]-a[i]-1;  
    sort(b+1,b+n);  
    k=n-m>0?n-m+1:1;  
    for(i=n-1;i>=k;i--)  
    t+=b[i];  
    printf("%d\n",a[n]-a[1]+1-t);  
    return 0;  
}  


1.3.3 Prime Cryptarithm

 

需要注意输入格式,如scanf遇空格,换行则输入结束等,另外需要记录每一个字母在原数组中的位置,这样方便于输出

 

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<ctype.h>
using namespace std;

int maxlen,len,l,r,sum;
int n[20005],j;
char s[20005],c[20005];
int lef,righ;

int huiwen(int l,int r)
{
    while(l>=0&&r<=j)
    {
        if(s[l]==s[r])
        {
            l--,r++;
            len+=2;
        }
        else
            break;
    }
    if(len>maxlen)
    {
        maxlen=len;
        lef=n[l+1];
        righ=n[r-1];
    }
}
int main()
{
    freopen("calfflac.in","r",stdin);
    freopen("calfflac.out","w",stdout);
    int i=0;
    while(scanf("%c",&c[i++])!=EOF)
        ;                           //注意输入格式的书写
    sum=strlen(c);
    for(i=0,j=0; i<sum; i++)
    {
        if (isalpha(c[i]))
        {
            n[j]=i;             //记录每一个字母在原数组中的位置
            if(c[i]>='A'&&c[i]<='Z')
                s[j++]=c[i]+32;
            else if(c[i]>='a'&&c[i]<='z')
                s[j++]=c[i];
        }
    }
    for(i=1; i<j; i++)
    {
        len=1;
        huiwen(i-1,i+1);
        len=0;
        huiwen(i-1,i);
    }
    cout<<maxlen<<endl;
    for(i = lef; i<= righ; i++)
        cout<<c[i];
    cout<<endl;
    return 0;
}


1.3.4 Prime Cryptarithm

 

 

 

这一题我用的是穷举,最坏情况考虑为O(9^5*10),注意判断即可,至于所写的代码,连我自己都不忍直视了。。。

题解上说还有哈希表解法(不明觉厉-_-!),可惜暂时不会,还有好多要学啊!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值