您的位置:首页 > 其它

SDNU_ACM_ICPC_2017_Winter_Practice_1th

2017-01-23 20:32 417 查看

A POJ 1061 青蛙的约会

嗷嗷待补23333

大概用的是线性同余什么的吧。。

B POJ 1125 Stockbroker Grapevine

最短路(Dijkstra)

输入的第一行是N个人。

接下来每一行第一个数是和他建立联系的人的数量 然后输入人的编号以及消息传过去所需要的时间。

/*********************
author : MengFanzhuang
*********************/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

void Dij();
int a[105][105],dis[105],N,m,st,en;
bool vis[105]= {0};
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
while(scanf("%d",&N)!=EOF&&N)
{
memset(a,0x1,sizeof(a));
memset(vis,0,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
for(int j=1; j<=N; ++j)
{
int n;
scanf("%d",&n);
for(int i=0; i<n; ++i)
{
int a1,a2;
scanf("%d%d",&a1,&a2);
a[j][a1]=a2;
}
}
int diss=9999,num;
for(int i=1; i<=N; ++i)
{
memset(vis,0,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
st=i;
Dij();
sort(dis+1,dis+N+1,cmp);

if(dis[1]<diss)
{
diss=dis[1];
num=i;
}
}
if(diss<9999) cout<<num<<' '<<diss<<endl;
else cout<<"disjoint"<<endl;
}
return 0;
}
void Dij()
{
for(int i=1; i<=N; ++i)
{
dis[i]=a[st][i];
}
vis[st]=1;
dis[st]=0;
for(int i=1; i<=N; ++i)
{
int minn=9999,j=0;
for(int i1=1; i1<=N; ++i1)
{
if(!vis[i1]&&minn>dis[i1])
{
j=i1;
minn=dis[i1];
}
}
vis[j]=1;
for(int i1=1; i1<=N; ++i1)
{
if(!vis[i1]&&dis[i1]>minn+a[j][i1])
dis[i1]=minn+a[j][i1];
}
}
}


C HDU 2051 Bitset

进制转换

输入10进制数输出2进制数。

/*********************
author : MengFanzhuang
*********************/

#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int a[30]={0},i=0;
while(n)
{
a[i++]=n%2;
n/=2;
}
bool flag=0;
while(i--)
{
cout<<a[i];
}
cout<<endl;
}
return 0;
}


D POJ 1860 Currency Exchange

最短路(SPFA判环)

输入

第一行货币数N 交换点数M 拥有的货币种类S 拥有的货币数V。

接下来M行 前两个数交换的货币种类a b 然后是a->b的汇率和手续费 b->a的汇率和手续费。

和E的做法差不多先做了E然后稍微改了改a了这一道。

/*********************
author : MengFanzhuang
*********************/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

void SPFA();
queue<int> q;
double dis[105],a[105][105],b[105][105],v;
int n,m,s,time[105];
bool flag;

int main()
{
while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF)
{
flag=1;
memset(a,0,sizeof(a));
memset(dis,0,sizeof(dis));
for(int j=0; j<m; ++j)
{
int a1,a2;
double a3,a4,a5,a6;
scanf("%d%d%lf%lf%lf%lf",&a1,&a2,&a3,&a4,&a5,&a6);
a[a1][a2]=a3;
a[a2][a1]=a5;
b[a1][a2]=a4;
b[a2][a1]=a6;
}
SPFA();
if(!flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
void SPFA()
{
dis[s]=v;
q.push(s);
while(!q.empty())
{
int i=q.front();
q.pop();
for(int i1=1; i1<=n; ++i1)
{
if(dis[i1]<(dis[i]-b[i][i1])*a[i][i1])
{
dis[i1]=(dis[i]-b[i][i1])*a[i][i1];
q.push(i1);
time[i1]++;
}
if(time[i1]>n)
{
flag=0;
while(!q.empty())
q.pop();
break;
}
}
}
}


E POJ 2240 Arbitrage

最短路(SPFA判环)

输入货币的名字然后是两种货币之间的汇率

之前一直在判断i为起点的时候最后dis[i]>1于是当时就没做出来。

后来理解了这个判环才a过。

因为有环的话dis不断变大就会一直循环所以当time>n的时候直接结束然后输出YES就好了。

/*********************
author : MengFanzhuang
*********************/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

void SPFA();
queue<int> q;
double dis[105],a[105][105],b[105][105],v;
int n,m,s,time[105];
bool flag;

int main()
{
while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF)
{
flag=1;
memset(a,0,sizeof(a));
memset(dis,0,sizeof(dis));
for(int j=0; j<m; ++j)
{
int a1,a2;
double a3,a4,a5,a6;
scanf("%d%d%lf%lf%lf%lf",&a1,&a2,&a3,&a4,&a5,&a6);
a[a1][a2]=a3;
a[a2][a1]=a5;
b[a1][a2]=a4;
b[a2][a1]=a6;
}
SPFA();
if(!flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
void SPFA()
{
dis[s]=v;
q.push(s);
while(!q.empty())
{
int i=q.front();
q.pop();
for(int i1=1; i1<=n; ++i1)
{
if(dis[i1]<(dis[i]-b[i][i1])*a[i][i1])
{
dis[i1]=(dis[i]-b[i][i1])*a[i][i1];
q.push(i1);
time[i1]++;
}
if(time[i1]>n)
{
flag=0;
while(!q.empty())
q.pop();
break;
}
}
}
}


F POJ 2387 Til the Cows Come Home

最短路(Dijkstra)

输入T个点N条路。

N行每一行a到b所需的时间t。

/*********************
author : MengFanzhuang
*********************/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
void Dij();
int dis[1005],a[1005][1005],n,m,st,en;
bool vis[1005]= {0};
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
st=n;
en=1;
memset(a,0x7f,sizeof(a));
memset(vis,0,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
for(int j=0; j<m; ++j)
{
int a1,a2,a3;
scanf("%d%d%d",&a1,&a2,&a3);
if(a3<a[a1][a2])
{
a[a1][a2]=a3;
a[a2][a1]=a3;
}
}
Dij();
cout<<dis[1]<<endl;

}
return 0;
}
void Dij()
{
for(int i=1; i<=n; ++i)
{
dis[i]=a[st][i];
}
vis[st]=1;
dis[st]=0;
for(int i=1; i<=n; ++i)
{
int minn=9999999,j;
for(int i1=1; i1<=n; ++i1)
{
if(!vis[i1]&&minn>dis[i1])
{
j=i1;
minn=dis[i1];
}
}
vis[j]=1;
for(int i1=1; i1<=n; ++i1)
{
if(!vis[i1]&&dis[i1]>minn+a[j][i1])
dis[i1]=minn+a[j][i1];
}
}
}


G HDU 3037 Saving Beans

嗷嗷待补2333

卢卡斯定理大概。。

H HDU 2095 find your present (2)

异或

大概是太简单所以懒得补这个题2333。贴傻队长的代码吧。

(傻队长第一行的s不加注释还问我为啥ce23333)

//s
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

int main()
{
int i,j;
while(scanf("%d",&i))
{
if(i==0)break;
int a,ans=0;
for(int j=1;j<=i;j++)
{
scanf("%d",&a);
ans=ans^a;
}
printf("%d\n",ans);
}
}


I POJ 1502 MPI Maelstrom

最短路(Dijkstra)

输入第一行N个点。

接下来N-1行 第i行i-1个数或者x 第j个数表示j到i的距离 x表示没有路。

看懂输入这个题就很容易了。

/*********************
author : MengFanzhuang
*********************/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
void Dij();
int dis[1005],a[1005][1005],n,st;
bool vis[1005]= {0};
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(a,0x7f,sizeof(a));
memset(vis,0,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
for(int j=2; j<=n; ++j)
{
char a1[20];
int a2;
for(int i=1; i<j; ++i)
{
scanf("%s",a1);
if(a1[0]!='x')
{
a2=atoi(a1);
a[j][i]=a[i][j]=a2;
}
}
}
st=1;
Dij();
sort(dis+1,dis+n+1,cmp);
cout<<dis[1]<<endl;
}
return 0;
}
void Dij()
{
for(int i=1; i<=n; ++i)
{
dis[i]=a[st][i];
}
vis[st]=1;
dis[st]=0;
for(int i=1; i<=n; ++i)
{
int minn=9999999,j;
for(int i1=1; i1<=n; ++i1)
{
if(!vis[i1]&&minn>dis[i1])
{
j=i1;
minn=dis[i1];
}
}
vis[j]=1;
for(int i1=1; i1<=n; ++i1)
{
if(!vis[i1]&&dis[i1]>minn+a[j][i1])
dis[i1]=minn+a[j][i1];
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: