A.Marks
基础题,找每列的最大字母。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#define N 1000000007
using namespace std;
inline void RD(int &ret)
{
char c;
do
{
c=getchar();
}
while(c<'0'||c>'9');
ret=c-'0';
while((c=getchar())>='0'&&c<='9')
{
ret=ret*10+(c-'0');
}
}
inline void OT(int a)
{
if(a>=10)
{
OT(a/10);
}
putchar(a%10+'0');
}
int main()
{
int n,m,i,j,y[111],z;
char M,x[111][111];
RD(n);
RD(m);
memset(y,0,sizeof(y));
for(i=0;i<n;++i)
{
scanf("%s",x[i]);
}
for(j=0;j<m;++j)
{
M='0';
for(i=0;i<n;++i)
{
if(x[i][j]>=M)
{
M=x[i][j];
}
}
for(i=0;i<n;++i)
{
if(x[i][j]==M)
{
y[i]++;
}
}
}
z=0;
for(i=0;i<n;++i)
{
if(y[i]>0)
{
z++;
}
}
OT(z);
printf("\n");
return 0 ;
}
B.Steps
模拟,每次走最大步就行,可我想复杂了,用二分枚举写了,WA了一发,改了二分次数就过了。。。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
inline void RD(int &ret)
{
char c;
do
{
c=getchar();
}
while(c<'0'||c>'9');
ret=c-'0';
while((c=getchar())>='0'&&c<='9')
{
ret=ret*10+(c-'0');
}
}
inline void OT(int a)
{
if(a>=10)
{
OT(a/10);
}
putchar(a%10+'0');
}
int main()
{
int k,i,j;
long long xc,yc,high,low,mid,x[10001],y[10001],n,m,ans;
cin>>n>>m>>xc>>yc>>k;
for(i=0; i<k; ++i)
{
cin>>x[i]>>y[i];
}
ans=0;
for(i=0; i<k; ++i)
{
low=0;
high=1000000000;
j=0;
while(low<high)
{
mid=(low+high)/2;
if((xc+x[i]*mid)>=1&&(xc+x[i]*mid)<=n&&(yc+y[i]*mid)>=1&&(yc+y[i]*mid)<=m)
{
low=mid;
}
else
{
high=mid;
}
j++;
if(j==40)
{
break;
}
}
for(j=high; j>=low; --j)
{
if((xc+x[i]*j)>=1&&(xc+x[i]*j)<=n&&(yc+y[i]*j)>=1&&(yc+y[i]*j)<=m)
{
ans+=j;
xc+=x[i]*j;
yc+=y[i]*j;
break;
}
}
}
cout<<ans<<endl;
return 0 ;
}
C.Pocket Book
排列组合题,只要求每列的不同字母数在相乘就行了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
using namespace std;
inline void RD(int &ret)
{
char c;
do
{
c=getchar();
}
while(c<'0'||c>'9');
ret=c-'0';
while((c=getchar())>='0'&&c<='9')
{
ret=ret*10+(c-'0');
}
}
inline void OT(int a)
{
if(a>=10)
{
OT(a/10);
}
putchar(a%10+'0');
}
int main()
{
set<char>a[111];
int n,m,i,j;
char x[101];
long long ans=1;
RD(n);
RD(m);
for(i=0;i<n;++i)
{
scanf("%s",&x);
for(j=0;j<m;++j)
{
a[j].insert(x[j]);
}
}
for(i=0;i<m;++i)
{
ans=ans*(a[i].size())%1000000007;
}
cout<<ans<<endl;
return 0 ;
}