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]; } } }
相关文章推荐
- SDNU_ACM_ICPC_2017_Winter_Practice_2th
- SDNU_ACM_ICPC_2017_Winter_Practice_5th
- SDNU_ACM_ICPC_2017_Winter_Practice_3th
- 2017_SDNU_ACM-ICPC_Provincial_Team_Selection_Round_1【--完结--】
- SDNU_ACM_ICPC_2017_拓扑排序
- 2017_SDNU_ACM/ICPC_Freshman's Easy Game
- 2017_SDNU_ACM-ICPC_Provincial_Team_Selection_Round_2【--完结--】
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F. Trig Function cos(nx)
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E.Maximum Flow【规律】
- HDU 6212 Zuma ACM/ICPC 2017 Qingdao Online(区间dp)
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B. Coin
- 【 2017 ACM-ICPC 亚洲区(西安赛区)网络赛】C. Sum
- 计蒜客 16956 Query on a string(2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 G)
- 「备战PKUWC2018」The 2017 ACM-ICPC Asia Shenyang Regional Contest 「HDU6217-6229」
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛- J. Minimum Distance in a Star Graph
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 H. A Cache Simulator
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛-I-GSM Base Station Identification(线性变换)
- Finding the Radius for an Inserted Circle--2017 ACM-ICPC 亚洲区(南宁赛区)网络赛
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Minimum Distance in a Star Graph
- Frequent Subsets Problem 进制运算 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛