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),注意判断即可,至于所写的代码,连我自己都不忍直视了。。。
题解上说还有哈希表解法(不明觉厉-_-!),可惜暂时不会,还有好多要学啊!