Highways
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 18400 | Accepted: 8543 |
Description
The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. So the traffic is difficult in Flatopia. The Flatopian government is aware of this problem. They're planning to build some highways so that it will be possible to drive between any pair of towns without leaving the highway system.
Flatopian towns are numbered from 1 to N. Each highway connects exactly two towns. All highways follow straight lines. All highways can be used in both directions. Highways can freely cross each other, but a driver can only switch between highways at a town that is located at the end of both highways.
The Flatopian government wants to minimize the length of the longest highway to be built. However, they want to guarantee that every town is highway-reachable from every other town.
Flatopian towns are numbered from 1 to N. Each highway connects exactly two towns. All highways follow straight lines. All highways can be used in both directions. Highways can freely cross each other, but a driver can only switch between highways at a town that is located at the end of both highways.
The Flatopian government wants to minimize the length of the longest highway to be built. However, they want to guarantee that every town is highway-reachable from every other town.
Input
The first line of input is an integer T, which tells how many test cases followed.
The first line of each case is an integer N (3 <= N <= 500), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within [1, 65536]) between village i and village j. There is an empty line after each test case.
The first line of each case is an integer N (3 <= N <= 500), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within [1, 65536]) between village i and village j. There is an empty line after each test case.
Output
For each test case, you should output a line contains an integer, which is the length of the longest road to be built such that all the villages are connected, and this value is minimum.
Sample Input
1 3 0 990 692 990 0 179 692 179 0
Sample Output
692
Hint
Huge input,scanf is recommended.
Source
POJ Contest,Author:Mathematica@ZSU
唯一一道会做的mst...
#include<iostream>
#define INF 0x3f3f3f3f
using namespace std;
int n;
int map[505][505];
int visit[505];
int dis[505];
void getmap()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>map[i][j];
}
}
}
void prim()
{
int k=1;
int ans=0;
memset(visit,0,sizeof(visit));
memset(dis,INF,sizeof(dis));
for(int i=1;i<=n;i++)
{
dis[i]=map[1][i];
}
visit[1]=1;
for(int i=1;i<n;i++)
{
int MIN=INF;
for(int j=1;j<=n;j++)
{
if(!visit[j]&&dis[j]<MIN)
{
MIN=dis[j];
k=j;
}
}
if(MIN==INF)
break;
visit[k]=1;
ans+=MIN;
for(int j=1;j<=n;j++)
{
if(!visit[j])
{
dis[j]=min(dis[j],map[k][j]);
}
}
}
cout<<ans<<endl;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n;
getmap();
prim();
}
system("pause");
return 0;
}
最短路
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 20977 Accepted Submission(s): 8965
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
Sample Output
3 2
Source
Recommend
lcy
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define INF 0x3f3f3f3f
using namespace std;
int n;
int map[105][105];
int visit[105];
int dis[105];
int m;
void getmap()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
map[i][j]=i==j?0:INF;
}
}
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
map[a][b]=map[b][a]=min(c,map[a][b]);
}
}
void dijsktra()
{
int k=1;
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
for(int i=1;i<=n;i++)
{
dis[i]=map[1][i];
}
for(int i=0;i<n;i++)
{
int MIN=INF;
for(int j=1;j<=n;j++)
{
if(!visit[j]&&dis[j]<MIN)
{
MIN=dis[j];
k=j;
}
}
if(MIN==INF)
break;
visit[k]=1;
for(int j=1;j<=n;j++)
{
if(!visit[j])
{
dis[j]=min(dis[j],dis[k]+map[k][j]);
}
}
}
cout<<dis[n]<<endl;
}
int main()
{
while(cin>>n>>m,n!=0&&m!=0)
{
getmap();
dijsktra();
}
return 0;
}
#include<iostream>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
int map[105][105];
int visit[105];
int dis[105];
int n,s,e;
void getmap()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
map[i][j]=i==j?0:INF;
}
}
for(int i=1;i<=n;i++)
{
int sum;
cin>>sum;
for(int j=0;j<sum;j++)
{
int x;
cin>>x;
if(j)
{
map[i][x]=1;
}
else
{
map[i][x]=0;
}
}
}
}
void dijsktra()
{
int k=1;
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
for(int i=1;i<=n;i++)
{
dis[i]=map[s][i];
}
visit[s]=1;
for(int i=0;i<n;i++)
{
int MIN=INF;
for(int j=1;j<=n;j++)
{
if(!visit[j]&&dis[j]<MIN)
{
MIN=dis[j];
k=j;
}
}
if(MIN==INF)
break;
visit[k]=1;
for(int j=1;j<=n;j++)
{
if(!visit[j])
{
dis[j]=min(dis[j],dis[k]+map[k][j]);
}
}
}
if(dis[e]==INF)
{
cout<<"-1"<<endl;
}
else
{
cout<<dis[e]<<endl;
}
}
int main()
{
cin>>n>>s>>e;
getmap();
dijsktra();
return 0;
}
其实不太懂。。
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 505
int n;
long long int sum[MAXN];
int map[MAXN][MAXN];
int del[MAXN];
using namespace std;
void floyd()
{
for(int k=n-1;k>=0;--k)
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
map[i][j]=min(map[i][del[k]]+map[del[k]][j],map[i][j]);
}
}
for(int i=n-1;i>=k;i--)
{
for(int j=n-1;j>=k;j--)
{
sum[k]+=map[del[i]][del[j]];
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>map[i][j];
}
}
for(int i=0;i<n;i++)
{
cin>>del[i];
sum[i]=0;
}
floyd();
for(int i=0;i<n;i++)
{
if(i!=0)
cout<<" ";
cout<<sum[i];
}
cout<<endl;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a,b;
while(cin>>a>>b)
{
cout<<a+b<<endl;
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int map[105][105];
int visit[105];
int n;
int N;
int column(int index)
{
memset(visit,0,sizeof(visit));
for(int i=0;i<N;i++)
{
if(visit[map[i][index]])
{
return 0;
}
if(map[i][index]!=0)
{
visit[map[i][index]]=1;
}
}
return 1;
}
int row(int index)
{
memset(visit,0,sizeof(visit));
for(int i=0;i<N;i++)
{
if(visit[map[index][i]])
{
return 0;
}
if(map[index][i]!=0)
{
visit[map[index][i]]=1;
}
}
return 1;
}
int oksquare(int x,int y)
{
memset(visit,0,sizeof(visit));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(map[i+x][y+j]==0)
{
continue;
}
if(visit[map[i+x][y+j]])
{
return 0;
}
visit[map[i+x][y+j]]=1;
}
}
return 1;
}
int judge()
{
for(int i=0;i<N;i++)
{
if(!column(i))
{
return 0;
}
if(!row(i))
{
return 0;
}
}
for(int i=0;i<N;i+=n)
{
for(int j=0;j<N;j+=n)
{
if(!oksquare(i,j))
{
return 0;
}
}
}
return 1;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
N=n*n;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
scanf("%d",&map[i][j]);
}
}
if(judge())
{
printf("CORRECT\n");
}
else
{
printf("INCORRECT\n");
}
}
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int n;
int a[100005];
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int j;
for(j=2;a[j]==a[1];j++)
{
;
}
int flag=0;
if(a[j]>a[1])
{
for(int i=j+1;i<=n;i++)
{
if(a[i]<a[i-1])
{
cout<<"3"<<endl;
cout<<"1 "<<i-1<<" "<<i<<endl;
return 0;
}
}
}
if(a[j]<a[1])
{
for(int i=j+1;i<=n;i++)
{
if(a[i]>a[i-1])
{
cout<<"3"<<endl;
cout<<"1 "<<i-1<<" "<<i<<endl;
return 0;
}
}
}
cout<<"0"<<endl;
return 0;
}
/*
dp[i]表示前i株植物不需要移动的最大数目,其中第i株不动
则dp[i]=max{dp[j]},1<=j<=i,其中s[j]<s[i]
所求即为n-dp[n]
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int main()
{
int n,m;
int s[5005];
double x[5005];
int dp[5005];
while(cin>>n>>m)
{
for(int i=1;i<=n;i++)
{
cin>>s[i]>>x[i];
}
s[n+1]=m+1;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n+1;i++)
{
for(int j=1;j<i;j++)
{
if(s[j]<=s[i])
{
dp[i]=max(dp[i],dp[j]);
}
}
dp[i]++;
}
cout<<n-dp[n]<<endl;
}
return 0;
}
/*
(n,k)(k<=n)的奇偶性取决于(n-k)与k的二进制表达式是否存在同一位上的两个数码均为1,
若存在,则为偶数,反之为奇数
*/
#include<iostream>
using namespace std;
int main()
{
int n,k;
while(cin>>n>>k)
{
if(k&(n-k))
{
cout<<"0"<<endl;
}
else
{
cout<<"1"<<endl;
}
}
return 0;
}
复杂度小一点的筛法不会做。。下面代码tle
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int gcd(int a,int b)
{
int r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
int main()
{
int n;
int a[100005];
int dp[100005];
while(cin>>n)
{
a[0]=1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(gcd(a[i],a[j])>1)
{
dp[i]=max(dp[i],dp[j]);
}
}
dp[i]++;
}
cout<<dp[n]<<endl;
}
return 0;
}
/*
二分
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int n,m,l;
int dis[500005];
/*
int ok(int ability)
{
int j=0,i=0,cur=0;
for(int tt=1;tt<=m;tt++)
{
while(dis[j]-dis[i]<=ability)
{
j++;
if(j-1==n+1)
{
break;
}
}
cur=dis[j-1];
i=j-1;
if(cur>=l)
{
break;
}
}
if(cur<l)
{
return 0;
}
else
{
return 1;
}
}
*/
int ok(int ablity)
{
if(ablity*m<l)
{
return 0;
}
int i=0,cnt=0,j=0;
while(i<=n+1)
{
if(dis[i]-dis[j]>ablity)
{
return 0;
}
while(dis[i]-dis[j]<=ablity&&i<=n+1)
{
i++;
}
j=i-1;
cnt++;
}
if(cnt>m)
{
return 0;
}
else
{
return 1;
}
}
int main()
{
while(scanf("%d%d%d",&l,&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&dis[i]);
}
dis[0]=0;
dis[n+1]=l;
sort(dis,dis+n+2);
int left=0;
int right=l;
int mid;
while(left<right)
{
mid=(left+right)/2;
if(ok(mid))
{
right=mid-1;
}
else
{
left=mid+1;
}
}
mid=(left+right)/2;
printf("%d\n",mid);
}
return 0;
}
/*
模拟就好
pe了一万遍
*/
#include<iostream>
using namespace std;
int main()
{
char cow[2005];
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>cow[i];
}
int k=0;
int cnt=0;
for(int i=1;i<=n;i++)
{
int left=i;
int right=n;
while(cow[left]==cow[right])
{
left++;
right--;
}
if(cow[left]<cow[right])
{
cout<<cow[i];
}
else
{
cout<<cow[n];
n--;
i--;
}
cnt++;
if(cnt%80==0)
{
cout<<endl;
}
}
return 0;
}
/*
简单贪心,排序后一次寻找中间那个数就好
*/
include<iostream>
#include<algorithm>
using namespace std;
int n,R;
int a[1005];
int main()
{
while(cin>>R>>n,R!=-1&&n!=-1)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int ans=0;
sort(a,a+n);
for(int i=0;i<n;i++)
{
int j;
for(j=i+1;j<n;j++)
{
if(a[i]+R<a[j])
{
break;
}
}
int k;
for(k=j-1;k<n;k++)
{
if(a[j-1]+R<a[k])
{
break;
}
}
ans++;
i=k-1;
}
cout<<ans<<endl;
}
return 0;
}
/*
简单huffman
用优先队列做的
注意要用Long Long
*/
#include<iostream>
#include<queue>
using namespace std;
struct node
{
long long len;
bool operator <(const node &x)const
{
return len>x.len;
}
}pq;
priority_queue<node> que;
int main()
{
int n;
long long ans=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>pq.len;
que.push(pq);
}
while(que.size()>1)
{
long long a=que.top().len;
que.pop();
long long b=que.top().len;
que.pop();
pq.len=a+b;
que.push(pq);
ans+=pq.len;
}
cout<<ans<<endl;
return 0;
}
/*
贪心
排序后
每次选择包括范围最大的
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
struct node
{
int start;
int end;
}cow[25005];
bool cmp(const node &a,const node &b)
{
if(a.start==b.start)
{
return a.end>b.end;
}
else
{
return a.start<b.start;
}
}
int main()
{
int n,t;
scanf("%d%d",&n,&t);
for(int i=0;i<n;i++)
{
scanf("%d%d",&cow[i].start,&cow[i].end);
}
sort(cow,cow+n,cmp);
if(cow[0].start!=1)
{
printf("-1\n");;
}
else if(cow[0].end==t)
{
printf("1\n");
}
else
{
int maxend=0;
int k;
int flag=0;
int ok=0;
int cnt=1;
for(int i=0;i<n; )
{
flag=0;
maxend=cow[i].end;
for(int j=i+1;j<n;j++)
{
if(cow[j].start>=cow[i].start&&cow[j].start<=cow[i].end+1)
{
if(cow[j].end>maxend)
{
maxend=cow[j].end;
k=j;
flag=1;
}
}
}
if(flag)
{
i=k;
cnt++;
}
else
{
break;
}
if(cow[i].end==t)
{
ok=1;
break;
}
}
if(ok)
{
printf("%d\n",cnt);
}
else
{
printf("-1\n");
}
}
return 0;
}
/*
先求出每个island可能圆心的左右边界
问题转换成一般的贪心选择问题
然后从小到大排序后
从左往右贪心寻找(右边界优先)
*/
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int n,d;
struct node
{
double left;
double right;
}island[1005];
bool cmp(const node &a,const node &b)
{
return a.left<b.left;
}
int main()
{
int tt=1;
while(cin>>n>>d,n!=0&&d!=0)
{
memset(island,0,sizeof(island));
int ans=1;
int flag=1;
for(int i=0;i<n;i++)
{
int x,y;
cin>>x>>y;
if(y>d)
{
flag=0;
}
else if(flag)
{
double lenx=sqrt(double(d*d-y*y));
island[i].left=x-lenx;
island[i].right=x+lenx;
}
}
if(!flag)
{
cout<<"Case "<<tt++<<": -1"<<endl;
}
else
{
sort(island,island+n,cmp);
double temp=island[0].right;
for(int i=1;i<n;i++)
{
if(island[i].left>temp)
{
ans++;
temp=island[i].right;
}
else if(island[i].right<temp)
{
temp=island[i].right;
}
}
cout<<"Case "<<tt++<<": "<<ans<<endl;
}
}
return 0;
}
Description
Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reservation system to determine which stall each cow can be assigned for her milking time. Of course, no cow will share such a private moment with other cows.
Help FJ by determining:
Help FJ by determining:
- The minimum number of stalls required in the barn so that each cow can have her private milking period
- An assignment of cows to these stalls over time
Input
Line 1: A single integer, N
Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.
Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.
Output
Line 1: The minimum number of stalls the barn must have.
Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.
Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.
Sample Input
5 1 10 2 4 3 6 5 8 4 7
Sample Output
4 1 2 3 2 4
Hint
Explanation of the sample:
Here's a graphical schedule for this output:
Here's a graphical schedule for this output:
Time 1 2 3 4 5 6 7 8 9 10 Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>> Stall 2 .. c2>>>>>> c4>>>>>>>>> .. .. Stall 3 .. .. c3>>>>>>>>> .. .. .. .. Stall 4 .. .. .. c5>>>>>>>>> .. .. ..Other outputs using the same number of stalls are possible.
线段树神马的不会。。
/*
tle了
*/
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int start;
int end;
int index;
}cow[50005];
bool cmp(const node &a,const node &b)
{
if(a.start==b.start)
{
return a.end>b.end;
}
else
{
return a.start<b.start;
}
}
int num[500005];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>cow[i].start>>cow[i].end;
cow[i].index=i;
}
sort(cow,cow+n,cmp);
int k=1;
int ok=0;
for(int i=0;i<n;i++)
{
if(!num[cow[i].index])
{
num[cow[i].index]=k;
}
int temp=cow[i].end;
for(int j=i+1;j<n;j++)
{
if(cow[j].start>temp)
{
num[cow[j].index]=k;
temp=cow[j].end;
}
}
k++;
}
int ans=0;
for(int i=0;i<n;i++)
{
ans=max(ans,num[i]);
}
cout<<ans<<endl;
for(int i=0;i<n;i++)
{
cout<<num[i]<<endl;
}
return 0;
}
明天计组实验的任务小一点
看看书
干做题不是办法