http://codeforces.com/problemset/problem/616/A
A题:比较两个长整数的大小(可能含有前导0), 数据位数高达10^6位;考虑用字符串
一开始想的是把前导0,去掉,然后从高位到低位逐位比较;TLE了
下面是TLE代码:
#include<cstdio>
#include<cstring>
using namespace std;
#define N 1000005
char s1[N],s2[N];
int main()
{
while(scanf("%s%s",s1,s2))
{
int ii=0,jj=0,c1=0,c2=0;
for(int i=0;i<strlen(s1);i++){
if(s1[i]!='0'){
ii=i;
break;
}
else
c1++;
}
if(c1==strlen(s1))
ii=strlen(s1)-1;
for(int j=0;j<strlen(s2);j++){
if(s2[j]!='0'){
jj=j;
break;
}
else
c2++;
}
if(c2==strlen(s2))
jj=strlen(s2)-1;
int t=strlen(s1)-ii,p=strlen(s2)-jj,num=0;
if(t>p)
printf(">\n");
else if(t<p)
printf("<\n");
else{
for(int k1=ii,k2=jj;k1<strlen(s1);k1++,k2++){
if(s1[k1]>s2[k2])
{
printf(">\n");
break;
}
else if(s1[k1]<s2[k2]){
printf("<\n");
break;
}
else
num++;
}
if(num==t)
printf("=\n");
}
}
return 0;
}
然后换了种想法,既然去掉前导0,行不通,可不可以补上前导0,用string模板类,一次A掉;
#include<string>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
string a,b;
while(cin>>a>>b)
{
if(a.length()>b.length()){
string s(a.length()-b.length(),'0');
b=s+b;
}
else{
string s(b.length()-a.length(),'0');
a=s+a;
}char c=(a>b)?'>':((a<b)?'<':'=');
cout<<c<<endl;
}
return 0;
}
http://codeforces.com/problemset/problem/616/B
B题:贪心实现
题目大意是(我来编一下=_=):小明请她女朋友去吃饭,但是他很modest,小明总是想挑便宜的饭店,而她女朋友是个有品位的人,总是想进高档餐厅,她也知道小明的小九九,于是他们想到了这样一个解决方法,假设所有的饭店都分布在 n 行,m 列的街道上,小明总是选择最便宜的饭店所在的那一列,而她女朋友总是选最高档的饭店所在的那一行,问最后她们会花费的费用。
贪心的思想:我们只用把每一行的最小值求出来,最后再求所有最小值中的最大值。
#include<cstdio>
#include<cstring>
#define MAXN 100+2
#define OXFF 0xffffffffff //注意点,一开始定义的是0xfffffff,wa了
__int64 s[MAXN][MAXN];
__int64 miv[MAXN];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
miv[i]=OXFF;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%I64d",&s[i][j]);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s[i][j]<miv[i])
miv[i]=s[i][j];
}
}
__int64 x=-1;
for(int i=1;i<=n;i++){
if(miv[i]>x)
x=miv[i];
}
printf("%I64d\n",x);
}
return 0;
}
C题:题目大意:给定n 行,m列矩阵,矩阵的行列定位的是字符‘*’或’.’;
独立分析每个‘*’,并把它看成‘.’,计算通过此点联通的‘.’的个数;
原题链接:
http://codeforces.com/problemset/problem/616/C
DFS实现,可是自己并没有A掉,一直TLE。。。。。。。。 =_=!!!
#include<cstdio>
#include<cstring>
#define N 1002
char matrix[N][N];
int num,n,m;
int a[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int vis[N][N];
void DFS(int i,int j)
{
for(int k=0;k<4;k++ )
{
int x=a[k][0]+i;
int y=a[k][1]+j;
if(x<0 || x>=n || y<0 || y>=m || matrix[x][y]!='.')
continue;
if(!vis[x][y])
{
vis[x][y]=1;
DFS(x,y);
num++;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
scanf("%s",matrix[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(matrix[i][j]=='*')
{
num=1;
vis[i][j]=1;
DFS(i,j);
matrix[i][j]=num%10+'0';
}
memset(vis,0,sizeof(vis));
printf("%c",matrix[i][j]);
}
printf("\n");
}
return 0;
}