(个人训练赛) poj1064 poj3616 poj3041

来源:互联网 发布:大数据是一种思维方式 编辑:程序博客网 时间:2024/05/16 14:58

这个poj1064其实是白书上的原题,但是不小心定义了一个重复变量,完全没看出来。导致我精度控制本应该输出2.01输出了2,然后导致我看不出错然后就WA到结束。


二分水题不多讲了。

#include <cstdio>#include <iostream>#include <string>#include <algorithm>#include <map>#include <cstring>#include <set>#include <vector>#include <cmath>using namespace std;const int maxn = 10000 + 5;double arr[maxn];int n,k;void solve(){    double l=0, r=999999;    double mid;    int sum;     for(int t=0; t<=100; t++)    {        mid = (l+r)/2;        sum = 0;        for(int i=1; i<=n; i++)            sum += (int)(arr[i]/mid);        if(sum >= k)            l = mid;        else            r = mid;    }    printf("%.2lf\n",floor(r*100)/100);}int main(){    while(scanf("%d%d",&n,&k)!=EOF && n && k)    {        memset(arr,0,sizeof(arr));        for(int i=1; i<=n; i++)            scanf("%lf",&arr[i]);        solve();    }}


poj 3616 应该是一个最长上升子序的题,但是不太会dp看过这个类型的题导致我也写不出。

dp[i]表示第i个时间段的最大值,然后状态转移为前i个每个最大中满足条件就加到第i个上去。同时更新最大。

#include <cstdio>#include <iostream>#include <string>#include <algorithm>#include <map>#include <cstring>#include <set>#include <vector>#include <cmath>using namespace std;const int maxn = 1000 + 5;struct node{    int l;    int r;    int eff;};node fck[maxn];bool cmp(node p, node q){    if(p.l == q.l)        return p.r < q.r;    return p.l < q.l;}long long  dp[maxn];int main(){    int n,m,R;    while(scanf("%d%d%d",&n,&m,&R)!=EOF && n && m && R)    {        long long ans = 0;        for(int i=0; i<m; i++)        {            scanf("%d%d%d",&fck[i].l,&fck[i].r,&fck[i].eff);        }        memset(dp,0,sizeof(dp));        sort(fck,fck+m,cmp);        for(int i=0; i<m; i++)        {            dp[i] = fck[i].eff;           for(int j=0; j<i; j++)           {               if(fck[i].l >= fck[j].r + R)               {                   dp[i] = max(dp[i],dp[j]+fck[i].eff);               }           }           ans = max(ans,dp[i]);        }        printf("%d\n",ans);    }}

poj3041这个是纯二分图匹配的模板题,这就暴露了我一个毛病就是看不出类型不会模板。。。多努力啊

题解:将x轴,y轴每一个点看成二分图两侧,input中的每一组数据就是表明左右两侧连一条线,即找到最大匹配数。

#include <cstdio>#include <iostream>#include <string>#include <algorithm>#include <map>#include <cstring>#include <set>#include <vector>using namespace std;const int maxn = 500 + 5;int maps[maxn][maxn];bool vis[maxn];int link[maxn];int n,k;int dfs(int t){    for(int i=1; i<=n; i++)    {        if(vis[i] == false && maps[t][i])        {            vis[i] = true;            if(link[i] == 0 || dfs(link[i]))            {                link[i] = t;                return 1;            }        }    }    return 0;}int main(){    while(scanf("%d%d",&n,&k)!=EOF && n && k)    {        int x,y;        memset(maps,0,sizeof(maps));        for(int i=0; i<k; i++)        {            scanf("%d%d",&x,&y);            maps[x][y] = 1;        }        memset(link,0,sizeof(link));        int num = 0;        for(int i=1; i<=n; i++)        {            memset(vis,0,sizeof(vis));            if(dfs(i))                num++;        }        printf("%d\n",num);    }}


原创粉丝点击