zoukankan      html  css  js  c++  java
  • 2014 CodingTrip

    1001: 食物链(poj1182),直接贴代码,稍作可过

    并查集

      1 //
      2 //  main.cpp
      3 //  携程1
      4 //
      5 //  Created by zhang on 14-4-11.
      6 //  Copyright (c) 2014年 apple. All rights reserved.
      7 //
      8 
      9 #include <iostream>
     10 #include <cstring>
     11 #include <cstdio>
     12 #include <cstdlib>
     13 #include <cmath>
     14 #include <string>
     15 #include <vector>
     16 #include <list>
     17 #include <map>
     18 #include <queue>
     19 #include <stack>
     20 #include <bitset>
     21 #include <algorithm>
     22 #include <numeric>
     23 #include <functional>
     24 
     25 using namespace std;
     26 const int maxk=100010;
     27 int N,K;
     28 int D[maxk],X[maxk],Y[maxk];
     29 int par[3*maxk],rankh[3*maxk];
     30 
     31 void init(int n)
     32 {
     33     for(int i=0;i<n;i++)
     34     {
     35         par[i]=i;
     36         rankh[i]=0;
     37     }
     38 }
     39 int find(int x)
     40 {
     41     if (par[x]==x)
     42     {
     43         return x;
     44     }
     45     else return par[x]=find(par[x]);
     46 }
     47 
     48 void unite(int x,int y)
     49 {
     50     x=find(x);
     51     y=find(y);
     52     if(x==y) return;
     53     
     54     if(rankh[x]<rankh[y])
     55     {
     56         par[x]=y;
     57     }
     58     else
     59     {
     60         par[y]=x;
     61         if(rankh[x]==rankh[y]) rankh[x]++;
     62     }
     63 }
     64 
     65 bool same(int x,int y)
     66 {
     67     return find(x)==find(y);
     68 }
     69 
     70 int main()
     71 {
     72     //freopen("Users/apple/Desktop/携程1/携程1.in","r",stdin);
     73     //freopen("Users/apple/Desktop/携程1/携程1.out","w",stdout);
     74     int T;
     75     scanf("%d",&T);
     76     while (T--) {
     77         
     78     scanf("%d%d",&N,&K);
     79     init(3*N);
     80     for(int i=0;i<K;i++)
     81     {
     82         scanf("%d %d %d",&D[i],&X[i],&Y[i]);
     83     }
     84     
     85     int ans=0;
     86     for(int i=0;i<K;i++)
     87     {
     88         int t=D[i];
     89         int x=X[i]-1,y=Y[i]-1;
     90         
     91         if(x<0||N<=x||y<0||N<=y)
     92         {
     93             ans++;
     94             continue;
     95         }
     96         if(t==1)
     97         {
     98             if(same(x,y+N)||same(x,y+2*N))
     99             {
    100                 ans++;
    101             }
    102             else
    103             {
    104                 unite(x,y);
    105                 unite(x+N,y+N);
    106                 unite(x+2*N,y+2*N);
    107             }
    108         }
    109         else
    110         {
    111             if (same(x,y)||same(x,y+2*N))
    112                 ans++;
    113             else
    114             {
    115                 unite(x,y+N);
    116                 unite(x+N,y+2*N);
    117                 unite(x+2*N,y);
    118             }
    119         }
    120     }
    121     
    122     printf("%d
    ",ans);
    123     }
    124     return 0;
    125 }
    1001

    1002: dp[i][j] 表示第一条边为i, 第二条边的长度为 j 是否可行。 然后对所有可行的三条边的组合求最大三角形面积即可。

    三角形面积:海伦公式

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <vector>
     6 #include <cmath>
     7 
     8 using namespace std;
     9 
    10 const int INF = 2000;
    11 const int MAXL = 2000;
    12 const int MAXN = 50;
    13 
    14 int n;
    15 int a[MAXN];
    16 int ans;
    17 bool dp[MAXL][MAXL];
    18 
    19 int my_abs(int x) {
    20     return x > 0 ? x : -x;
    21 }
    22 
    23 double Area(double x, double y, double z) {
    24     double p = (x+y+z)/2;
    25     return sqrt(p*(p-x)*(p-y)*(p-z));
    26 }
    27 
    28 bool check(int x, int y, int z) {
    29     int t[3] = {x, y, z};
    30     sort(t, t+3);
    31     if (t[0]+t[1] <= t[2]) return false;
    32     return true;
    33 }
    34 
    35 int main() {
    36     #ifdef Phantom01
    37         freopen("1002.txt", "r", stdin);
    38     #endif // Phantom01
    39 
    40     while (scanf("%d", &n)!=EOF) {
    41         if (0==n) break;
    42 
    43         int sum = 0;
    44         for (int i = 0; i < n; i++) {
    45             scanf("%d", &a[i]);
    46             sum += a[i];
    47         }
    48         memset(dp, false, sizeof(dp));
    49         dp[0][0] =true;
    50 
    51         for (int k = 0; k < n; k++)
    52             for (int i = sum - a[k]; i >= 0; i--)
    53                 for (int j = sum - a[k]; j >= 0; j--) {
    54                     dp[i+a[k]][j] = dp[i][j] || dp[i+a[k]][j];
    55                     dp[i][j+a[k]] = dp[i][j] || dp[i][j+a[k]];
    56                 }
    57         ans = -1;
    58         for (int i = 1; i <= sum; i++)
    59             for (int j = 1; j <= sum; j++) if (dp[i][j]) {
    60                 if (check(i, j, sum-i-j))
    61                     ans = max((int)(Area(i, j, sum-i-j)*100), ans);
    62             }
    63         printf("%d
    ", ans);
    64     }
    65 
    66     return 0;
    67 }
    1002

    1003:  二维线段树可做,不过因为数据范围比较小,逆序枚举所以矩形,看该点最后落在哪个矩形中。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 
     5 using namespace std;
     6 
     7 const int MAXN = 1050;
     8 
     9 int x[MAXN*2], y[MAXN*2];
    10 int x1[MAXN], x2[MAXN], y1[MAXN], y2[MAXN], R[MAXN], G[MAXN], B[MAXN];
    11 int n, m;
    12 int cntx, cnty;
    13 
    14 bool check(int px, int py, int k) {
    15     if (x1[k]<=px&&px<=x2[k] && y1[k]<=py&&py<=y2[k])
    16         return true;
    17     return false;
    18 }
    19 
    20 int main() {
    21     #ifdef Phantom01
    22         freopen("1003.txt", "r", stdin);
    23     #endif // Phantom01
    24 
    25     while (scanf("%d%d", &n, &m)!=EOF) {
    26         if (0==n&&0==m) break;
    27         cntx = cnty = 0;
    28         for (int i = 0 ; i < n; i++) {
    29             scanf("%d%d%d%d%d%d%d", &x1[i], &y1[i], &x2[i], &y2[i], &R[i], &G[i], &B[i]);
    30         }
    31         for (int i = 0; i < m; i++) {
    32             int px, py;
    33             bool flag = false;
    34             scanf("%d%d", &px, &py);
    35             for (int j = n-1; j >= 0; j--)
    36                     if (check(px, py, j)) {
    37                 flag = true;
    38                 printf("%d %d %d
    ", R[j], G[j], B[j]);
    39                 break;
    40             }
    41             if (!flag) puts("255 255 255");
    42         }
    43     }
    44 
    45     return 0;
    46 }
    1003

    1004: 可以证明,只有对称的时候后手能赢

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
        int n, i;
        int a[12];
        while(scanf("%d", &n), n) {
            for(i = 0; i < n; ++i) scanf("%d", a+i);
            sort(a, a+n);
            int cnt = 1;
            bool flag = 0;
            for(i = 1; i < n; ++i) {
                if(a[i] == a[i-1]) cnt++;
                else {
                    if(cnt&1) {
                        flag = 1;
                        break;
                    }
                    else cnt = 1;
                }
            }
            if(!flag) puts("Lose");
            else puts("Win");
        }
        return 0;
    }
    1004
  • 相关阅读:
    Linux配置手记及软件FAQ-更新到Fedora core 3
    怎样给多维数组动态分配内存
    mysql管理密码修改及管理权限设定(zz)
    链表处理函数(自己总结)
    二级C笔试试题
    中央广播电视大学19992000学年度第二学期“开放教育(本科)期末考试计算机科学与技术专业数据结构试题
    关闭计算机就这几招
    交大ftp校内搜索引擎终于好了!好!!
    有趣的Baidu。终于发现点比Google好的地方了
    几组重要概念
  • 原文地址:https://www.cnblogs.com/Phantom01/p/3671347.html
Copyright © 2011-2022 走看看