前两题都是水题,直接贴代码。
A 比较间接地比较大小 (456A)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#define maxn 100005
using namespace std;
struct node
{
int a,b;
}
c[maxn];
bool cmp(node u,node v)
{
return u.a<v.a;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
scanf("%d%d",&c[i].a,&c[i].b);
sort(c,c+n,cmp);
bool flag=0;
for(int i=1;i<n;i++)
{
if(c[i].b<c[i-1].b)
{
flag=1;
break;
}
}
if(flag==1) cout<<"Happy Alex"<<endl;
else cout<<"Poor Alex"<<endl;
return 0;
}
2. 找规律题 (456B)
(1^n+2^n+3^n+4^n)%4 的值,其实枚举上一些数后就会发现每隔一个4循环一次,同时,外加判断一个数是否
能被4整除的条件就是后两位数能否被4整除就行了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 990010
using namespace std;
int main()
{
int n,sum;
char str[maxn];
scanf("%s",str);
int len=strlen(str);
int a;
if(len>=2) a=(int)((str[len-2]-'0')*10+str[len-1]-'0');
else a=(int)(str[0]-'0');
int b=(a+5)%4;
if(b==1) cout<<"4"<<endl;
else cout<<"0"<<endl;
return 0;
}
3. 简单dp (455A)
比赛的过程中想了好久递推公式还是没有想出来,哎,今早看了别人的代码,才明白怎么作。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100010
using namespace std;
__int64 a[maxn],f[maxn];
int main()
{
__int64 m,n;
cin>>n;
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
for(int i=0;i<n;i++)
{
cin>>m;
a[m]+=m;
}
f[1]=a[1];
for(int i=2;i<maxn;i++)
{
f[i]=max(f[i-1],f[i-2]+a[i]);
}
cout<<f[maxn-1]<<endl;
return 0;
}