第一题: codeforces 485b
题意:给定一些点,要用尽量小的正方形框住所有的点,输出矩形的大小。
解题思路:维护x的最大值和最小值。同理y。然后取差值中的最大值作为变成,注意用long long
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
#define ll long long
int main()
{
int n;
ll xmi,xma,ymi,yma;
while(~scanf("%d",&n))
{
ll x,y;
scanf("%lld%lld",&x,&y);
xmi=x; xma=x; ymi=y; yma=y;
while(--n)
{
scanf("%lld%lld",&x,&y);
xmi=min(xmi,x);
xma=max(xma,x);
ymi=min(ymi,y);
yma=max(yma,y);
}
ll ans=max(xma-xmi,yma-ymi);
printf("%lld\n",ans*ans);
}
return 0;
}
第二题:UVA12627
题意:按照题目的规律 问第K天的时候,A到B行一共有多少个红色气球。
思路:先找规律,规律在于对于第k个小时的来说,总是可以分成右下角全是蓝色气球,右上角,左下角与左上角三个一模一样的k-1个小时的气球。这样的话,规律就很清晰了,然后用递归做比较方便。。。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<math.h>
using namespace std;
#define ll long long
ll f[33];
ll solve(ll x)
{
if(x==0) return 0;
ll z=1,sum=1;
while(x>=z)
{
sum*=3;
z*=2;
}
return sum/3+2*solve(x-z/2);
}
void init()
{
int i;
f[0]=1;
for(int i=1;i<=30;i++)
f[i]=f[i-1]*2;
}
int main()
{
ll n,t,ans,k,a,b,num=0;
scanf("%lld",&t);
init();
while(t--)
{
scanf("%lld%lld%lld",&k,&a,&b);
num++;
a=f[k]-a+1;
b=f[k]-b+1;
ans=solve(a)-solve(b-1);
printf("Case %lld: %lld\n",num,ans);
}
return 0;
}
第三题:UVA11488
题意:给你一些01串,某个前缀的pg为:此前缀长度*拥有此前缀的串的数量。求最大的pg值。
思路:先建一颗字典树,按照输入的顺序插入到字典树,每个插入的字符进行统计,并记录深度,最后,枚举所有节点,计算出最大的pg值即可。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<math.h>
using namespace std;
#define ll long long
#define nn 500500
struct node
{
int next[2];
int num,len;
void init()
{
memset(next,-1,sizeof(next));
num=len=0;
}
}tree[nn];
char s[220];
int tot,t,n;
void insert(char *s)
{
int p=0;
int l=strlen(s);
int id;
for(int i=0;i<l;i++)
{
id=s[i]-'0';
if(tree[p].next[id]==-1)
{
tree[p].next[id]=t;
tree[t].init();
tree[t++].len=tree[p].len+1;
}
p=tree[p].next[id];
tree[p].num++;
}
}
int query()
{
int ans=0;
queue<int>q;
q.push(0);
while(!q.empty())
{
int x=q.front();
q.pop();
ans=max(ans,tree[x].num*tree[x].len);
for(int i=0;i<2;i++)
{
if(tree[x].next[i]!=-1)
q.push(tree[x].next[i]);
}
}
return ans;
}
int main()
{
scanf("%d",&tot);
while(tot--)
{
scanf("%d",&n);
t=0;
tree[t++].init();
for(int i=0;i<n;i++)
{
scanf("%s",s);
insert(s);
}
int ans=query();
printf("%d\n",ans);
}
return 0;
}
第四题:codeforces 495b
题意:给出a,b的值,找出满足a%x = b中x的个数。
思路:根据题意我们可以列出方程(a-b)%x == 0,我们只需枚举满足(a-b)%i == 0&&i> b的个数即可。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
#define ll long long
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
{
a-=b;
if(a==0)
{
puts("infinity");
continue;
}
int ans=0,i;
for(i=1;i*i<a;i++)
{
if(a%i==0)
{
if(i>b) ans++;
if(a/i>b) ans++;
}
}
if(i*i==a && i>b) ans++;
printf("%d\n",ans);
}
return 0;
}
第五题:codeforces 379a
题意:有a根蜡烛,每根能燃1小时,蜡烛灭了后剩下一个烛头,b个烛头可以组成一个新的蜡烛,求点燃蜡烛的最长的时间。
思路:。。。。这个就是纯暴力。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
#define ll long long
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
{
int ans=0,c=0;
while(a>0||c>=b)
{
ans+=a;
c+=a;
a=c/b;
c-=a*b;
}
printf("%d\n",ans);
}
return 0;
}