poj1083解題報告

1.算法
對每組數據進行求解。首先讀入一組數據,通過一個結構體數組記錄這組數據,然後將這組數據進行排序,排序算法是根據結構體中的s,若s相同則按照t排序。對排序後的數據一遍一遍的從左往右掃描,每掃描一遍可以完成多次不衝突的搬運,每次掃描的時間爲10,一直掃描下去,直到所有的搬運完成,便可算出一共要的時間。
注意:題目中沒有說對應的s和t有s<=t,所以如果s>t要調換位置。
2.實現
(1)同樣用到了標準庫qsort函數,在之前要include<stdlib>。
(2)結構體中的數據在內存中的位置是連續的,整個結構體的大小爲結構體中各項數據大小的和。體現在在qsort的第3個參數爲每個結構體的大小(即結構體中各數據的大小和)還有比較函數com中在比較結構體中的第二個數據的時候可用*((int*)a+1)來訪問。
3.代碼

#include<cstdio>
#include<cstdlib>
struct ST
{
int s;
int t;
};
int com(const void* a,const void* b)
{
int result = *(int*)a-*(int*)b;
if(result==0) result=*((int*)a+1)-*((int*)b+1);
return result;
}
int main()
{
int result[1000]={0};
int size_of_result=0;
int T;
scanf("%d",&T);
for (int i=0;i<T;i++)
{
/*對第i組數據進行讀取計算處理*/
int n;
ST st[200];
//讀取第i組中的n個數據並對這n個數據依據s排序
scanf("%d",&n);
for(int j=0;j<n;j++)
{
scanf("%d%d",&st[j].s,&st[j].t);
if(st[j].s>st[j].t)
{
int temp = st[j].s;
st[j].s = st[j].t;
st[j].t = temp;
}
}
qsort((void*)st,n,2*sizeof(int),com);

//對第i組中的數據進行處理
int done_n=0;
bool done[200]={false};
int tail=0;

while(done_n!=n)
{
tail=0;
for(int j=0;j<n;j++)
{
if((!done[j])&&((st[j].s+1)/2>tail))
{
tail=(st[j].t+1)/2;
done[j]=true;
done_n++;
}
}
result[size_of_result]++;
}
size_of_result++;
}
for(int i=0;i<size_of_result;i++)
{
printf("%d\n",result[i]*10);
}
return 0;
}

ps:看到別人的一個比較好的算法

> 把過道分成200份,定義一個整型數組統計每塊過道上搬運經過的次數,
> 最後排序,輸出最大的次數乘以10即可!
>
> #include<iostream>
> #include<algorithm>
> using namespace std;
> int main()
> { int n,num,a[200][2],b[200];
> cin>>n;
> while(n--)
> {cin>>num;
> for(int m=0;m<200;m++)
> b[m]=0;
> for(int i=0;i<num;i++)
> {cin>>a[i][0]>>a[i][1];
> if(a[i][0]>a[i][1])
> {int temp=a[i][0];a[i][0]=a[i][1];a[i][1]=temp;}
> }
> for(int j=1;j<=200;j++)
> for(int k=0;k<num;k++)
> if((((a[k][0])<=2*j-1)&&((a[k][1])>=2*j-1)||(((a[k][0])<=2*j)&&((a[k][1])>=2*j))))
> b[j-1]++;
> sort(&b[0],&b[200]);
> if(b[199]!=0) cout<<b[199]*10<<endl;
> else cout<<'10'<<endl;
> }
> return 0;
> }
發佈了21 篇原創文章 · 獲贊 1 · 訪問量 1046
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章