这是这学期第二次周赛的题目,第一周的题目略坑,还在研究中。
A. The area
这道题题意是有一个开口向下的抛物线,与一条直线有两个交点,且交点位于抛物线顶点的两段。
给出两交点和顶点的坐标,求围成的面积。
就是一道简单的积分题。我写错了个变量,debug了很久。。sb了。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
double x;
double y;
};
double a,b,c;
double K,B;
node p[4];
double gao(double x)
{
double s=0;
s=a*x*x*x+b*x*x+c*x;
return s;
}
int main ()
{
int t,i;
cin>>t;
double area;
while(t--)
{
for (i=1; i<=3; i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
// for (i=1; i<=3; i++)
// printf("%lf %lf\n",p[i].x,p[i].y);
b=p[1].x;
c=p[1].y;
a=(p[2].y-c)/((p[2].x-b)*(p[2].x-b));
c=a*b*b+c;
b=(-2.0)*a*b;
K=(p[3].y-p[2].y)/(p[3].x-p[2].x);
B=p[3].y-K*p[3].x;
b=b-K;
c=c-B;
// cout<<a<<" "<<b<<" "<<c<<" "<<K<<" "<<B<<endl;
a=a/3;
b=b/2;
// cout<<a<<" "<<b<<" "<<c<<endl;
area=gao(p[3].x)-gao(p[2].x);
printf("%.2f\n",area);
}
return 0;
}
B. AC Me
一道水题,立马体现出了自己基本概念吃的不够透。。
一开始既然T了。。
代码就不贴了。。
C. 回文数猜想
好久没有敲题了,既然没有将用过的字符串清空。。蛋疼。。RE了两次。而且写的很麻烦,一开始思路不清晰
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctype.h>
using namespace std;
int map[1000000];
char a[15],b[15];
int len;
void change()
{
int i,j=0;
for (i=len-1; i>=0; i--)
b[j++]=a[i];
b[j]='\0';
}
int main ()
{
int i,j,k,s,num1,num2;
while(scanf("%s",a)!=EOF)
{
s=0;
len=strlen(a);
change();
if (strcmp(a,b)==0)
{
sscanf(a,"%d",&num1);
map[s++]=num1;
}
else
{
change();
while(1)
{
sscanf(a,"%d",&num1);
map[s++]=num1;
if (strcmp(a,b)==0) break;
sscanf(b,"%d",&num2);
num1=num2+num1;
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
i=0;
while(num1>0)
{
b[i++]=num1%10+'0';
num1=num1/10;
}
b[i]='\n';
len=i;
j=0;
for (i=len-1; i>=0; i--)
a[j++]=b[i];
a[j]='\n';
// puts(a);
// puts(b);
}
}
cout<<s-1<<endl;
for (i=0; i<s-1; i++)
cout<<map[i]<<"--->";
cout<<map[s-1]<<endl;
}
return 0;
}
D. Lake Counting
HDU 1282 水题
裸的DFS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char map[105][105]={0};
int dir[8][2]={{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1},{-1,0}};
int n,m,visit[105][105]={0};
int in(int x, int y)
{
if (x>=0 && x<n && y>=0 && y<m) return 1;
return 0;
}
void dfs(int x, int y)
{
int i,j,k,tx,ty;
visit[x][y]=1;
for (i=0; i<8; i++)
{
tx=x+dir[i][0];
ty=y+dir[i][1];
if (!visit[tx][ty] && in(tx,ty) && map[tx][ty]=='W')
{
dfs(tx,ty);
}
}
}
int main ()
{
scanf("%d%d",&n,&m);
int i,j,s=0;
for (i=0; i<n; i++)
for (j=0; j<m; j++)
cin>>map[i][j];
for (i=0; i<n; i++)
for (j=0; j<m; j++)
if (!visit[i][j] && map[i][j]=='W')
{
s++;
dfs(i,j);
}
cout<<s<<endl;
return 0;
}
E. A Bug's Life
POJ 2492 并查集
这道题还挺有意思的,主要是要建立一个数组来记录性别
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define maxn 2010
using namespace std;
int n,m,f[maxn]={0},sex[maxn]={0};
int find(int x)
{
if (x==f[x]) return x;
return (f[x]=find(f[x]));
}
void uni(int x, int y)
{
x=find(x);
y=find(y);
f[x]=f[y];
}
int main ()
{
int t,i,j,p=1;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for (i=1; i<=n; i++)
{
f[i]=i;
sex[i]=0;
}
int flag=1;
while(m--)
{
scanf("%d%d",&i,&j);
int a,b;
if (flag)
{
a=find(i);
b=find(j);
if (a==b) flag=0;
else
{
if (!sex[i]) sex[i]=j;
else uni(sex[i],j);
if (!sex[j]) sex[j]=i;
else uni(sex[j],i);
}
}
}
if (flag) printf("Scenario #%d:\nNo suspicious bugs found!\n",p++);
else printf("Scenario #%d:\nSuspicious bugs found!\n",p++);
cout<<endl;
}
return 0;
}
F 最短路
hdu 2544 最短路
裸题
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#define MAXN 105
#define INF 1000000
using namespace std;
int map[MAXN][MAXN];
int n,m;
void init()
{
int i,j,k;
for (i=1; i<=n; i++)
{
for (j=1; j<=n; j++)
map[i][j]=INF;
map[i][i]=0;
}
while (m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if (map[a][b]>c)
{
map[a][b]=c;
map[b][a]=c;
}
}
}
void dijkstra(int s, int e)
{
int i,j,k;
int dist[MAXN];
int visited[MAXN];
memset(visited,0,sizeof(visited));
visited[s]=1;
for (i=1; i<=n; i++)
dist[i]=map[s][i];
dist[s]=0;
for (j=1; j<=n-1; j++)
{
int temp=INF;
for (i=1; i<=n; i++)
if (!visited[i] && dist[i]<temp)
{
temp=dist[i];
k=i;
}
visited[k]=1;
for (i=1; i<=n; i++)
if (!visited[i] && dist[k]+map[k][i]<dist[i])
dist[i]=dist[k]+map[k][i];
}
printf("%d\n",dist[e]);
}
void spfa(int s, int e)
{
queue<int> q;
int i,j,k;
int dist[MAXN];
int visited[MAXN];
for (i=1; i<=n; i++)
dist[i]=INF;
dist[s]=0;
memset(visited,0,sizeof(visited));
visited[s]=1;
q.push(s);
while (!q.empty())
{
int x=q.front();
q.pop();
visited[x]=0;
for (i=1; i<=n; i++)
{
if (dist[i]>dist[x]+map[x][i])
{
dist[i]=dist[x]+map[x][i];
if (!visited[i])
{
q.push(i);
visited[i]=1;
}
}
}
}
printf("%d\n",dist[e]);
}
int main ()
{
while (cin>>n>>m)
{
if (n==0 && m==0)
break;
init();
spfa(1,n);
//dijkstra(1,n);
}
return 0;
}
G Crossing Rivers
HDU 3232 数学
这就是一个简单的数学题。每次走到河流岸边时,(河流长度为L),那么分配到每个点的概率为1/(L+1)(因为是从0到L)。而每个点可以向左和向右动,仔细观察发现向左和向右的路径之和为恒定的值(2L)。
然后就很简单了。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main ()
{
int n,d,i,j,pk=1,p,l,v;
while(scanf("%d%d",&n,&d)!=EOF)
{
if (n==0 && d==0) break;
double t=0;
int s=d;
while(n>0)
{
scanf("%d%d%d",&p,&l,&v);
s-=l;
t+=1.0*(l*l)/((l)*(v));
t+=l*1.0/v;
n--;
}
t+=s;
printf("Case %d: %.3f\n\n",pk++,t);
}
return 0;
}
H Jungles Road
裸的最小生成树
POJ 1251 MST
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 10000
using namespace std;
int map[27][27]={0};
int n,s;
void init()
{
int i,j,t;
char ch;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
map[i][j]=INF;
map[i][i]=0;
}
for (i=0; i<n-1; i++)
{
cin>>ch>>t;
while(t>0)
{
cin>>ch>>j;
map[i][ch-'A']=map[ch-'A'][i]=j;
t--;
}
}
}
void prime()
{
int i,j,k=0;
s=0;
int visit[30]={0};
int low[30]={0};
for (i=0; i<n; i++)
low[i]=map[0][i];
visit[0]=1;
for (i=1; i<n; i++)
{
int t=INF;
for (j=0; j<n; j++)
if (!visit[j] && low[j]<t)
{
k=j;
t=low[j];
}
s=s+low[k];
visit[k]=1;
for (j=0; j<n; j++)
if (!visit[j] && low[j]>map[k][j])
low[j]=map[k][j];
}
cout<<s<<endl;
}
int main ()
{
while(scanf("%d",&n)!=EOF)
{
if (n==0) break;
init();
// for (int i=0; i<n; i++)
// {
// for (int j=0; j<n; j++)
// cout<<map[i][j]<<" ";
// cout<<endl;
// }
prime();
}
return 0;
}
I Knight Moves
HDU 1372 BFS
这道也是很基础的BFS。做过挺多次了 不贴代码了