model

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了model相关的知识,希望对你有一定的参考价值。

   1 /**************************************************
   2 
   3             模版:01背包
   4             题目:HDU2602 Bone Collector
   5 
   6 **************************************************/
   7 
   8 #include<iostream>
   9 #include<cstring>
  10 #include<cstdio>
  11 using namespace std;
  12 const int maxn=1000+10;
  13 #define Max(a, b) ((a)>(b)?(a):(b))
  14 
  15 int T, n, m, p[maxn], v[maxn], f[maxn];
  16 
  17 int main()
  18 {
  19     scanf("%d", &T);
  20     while(T--)
  21     {
  22         memset(f, 0, sizeof f);
  23 
  24         scanf("%d%d", &n, &m);
  25         for(int i=1; i<=n; i++) scanf("%d", &p[i]);
  26         for(int i=1; i<=n; i++) scanf("%d", &v[i]);
  27         
  28         for(int i=1; i<=n; i++)
  29             for(int j=m; j>=v[i]; j--)
  30                 f[j]=Max(f[j], f[j-v[i]]+p[i]);
  31         printf("%d\n", f[m]);
  32     }
  33     return 0;
  34 }
  35 
  36 
  37 
  38 
  39 /**************************************************
  40 
  41             模版:并查集
  42             题目:POJ1182 食物链
  43 
  44 **************************************************/
  45 
  46 #include<iostream>
  47 #include<cstring>
  48 #include<cstdio>
  49 using namespace std;
  50 const int maxn=50000+10;
  51 
  52 int n, m, a[5], b[5], f[maxn*3], p[maxn*3];
  53 
  54 void Pre()
  55 {
  56     for(int i=1; i<=n; i++) p[i]=i, p[i+n]=i+n, p[i+n*2]=i+n*2;
  57     for(int i=1; i<=n; i++) f[i]=i+n, f[i+n]=i+n*2, f[i+n*2]=i;
  58     return ;
  59 }
  60 
  61 int Root(int x)
  62 {
  63     return (x==p[x])?(x):(p[x]=Root(p[x]));
  64 }
  65 
  66 int main()
  67 {
  68     scanf("%d%d", &n, &m);
  69     Pre();
  70 
  71     int d, x, y, ans=0;
  72 
  73     for(int i=1; i<=m; i++)
  74     {
  75         scanf("%d%d%d", &d, &x, &y);
  76 
  77         if(x>n||y>n||(d==2&&x==y))  
  78         {
  79             ++ans;
  80             continue;
  81         }
  82             
  83         a[0]=Root(x), a[1]=f[a[0]], a[2]=f[a[1]];
  84         b[0]=Root(y), b[1]=f[b[0]], b[2]=f[b[1]];
  85             
  86         bool flag=false;
  87         for(int j=0; j<3&&!flag; j++)  if(a[0]==b[j])  flag=true;
  88 
  89         if(d==1)
  90         {
  91             if(flag)    ans+=(a[0]!=b[0]);
  92             else for(int j=0; j<3; j++) p[b[j]]=a[j];
  93         }
  94         else
  95         {
  96             if(flag)    ans+=(a[0]!=b[1]);
  97             else for(int j=0; j<3; j++) p[b[j]]=a[(j+2)%3];
  98         }
  99             
 100     }
 101 
 102     printf("%d\n", ans);
 103     return 0;
 104 }
 105 
 106 
 107 
 108 
 109 /**************************************************
 110 
 111             模版:二分图最大匹配
 112             题目:POJ1274 The Perfect Stall
 113             
 114 **************************************************/
 115 
 116 #include<iostream>
 117 #include<cstring>
 118 #include<cstdio>
 119 using namespace std;
 120 const int maxn=200+10;
 121 
 122 int n, m, ans, from[maxn];
 123 int cur, fir[maxn], ver[maxn*maxn], nxt[maxn*maxn];
 124 bool vis[maxn];
 125 
 126 void Add(int u, int v)
 127 {
 128     ver[++cur]=v, nxt[cur]=fir[u], fir[u]=cur;
 129     return ;
 130 }
 131 
 132 bool Dfs(int u)
 133 {
 134     for(int i=fir[u], v; i; i=nxt[i])
 135     {
 136         if(vis[v=ver[i]])   continue;
 137         vis[v]=true;
 138         
 139         if((!from[v=ver[i]])||Dfs(from[v]))
 140         {
 141             from[v]=u;
 142             return true;
 143         }
 144     }
 145     return false;
 146 }
 147 
 148 int main()
 149 {
 150     while(scanf("%d%d", &n, &m)!=EOF)
 151     {
 152         cur=0, ans=0;
 153         memset(fir, 0, sizeof fir);
 154         memset(from, 0, sizeof from);
 155 
 156         for(int u=1, v, k; u<=n; u++)
 157         {
 158             scanf("%d", &k);
 159             for(int i=1; i<=k; i++)
 160             {
 161                 scanf("%d", &v);
 162                 Add(u, v);
 163             }
 164         }
 165 
 166         for(int i=1; i<=n; i++)
 167         {
 168             memset(vis, 0, sizeof vis);
 169             ans+=Dfs(i);
 170         }
 171 
 172         cout<<ans<<endl;
 173     }
 174     return 0;
 175 }
 176 
 177 
 178 
 179 
 180 /**************************************************
 181 
 182             模版:二分图最佳匹配
 183             题目:POJ2195 Going Home
 184             
 185 **************************************************/
 186 
 187 #include<iostream>
 188 #include<cstring>
 189 #include<cstdio>
 190 #define Min(a, b) ((a)<(b)?(a):(b))
 191 #define Abs(a) ((a)>0?(a):-(a))
 192 using namespace std;
 193 const int maxn=100+10;
 194 const int INF=0x7f7f7f7f;
 195 
 196 int n, m, ch, cm;
 197 int lx[maxn*maxn], ly[maxn], w[maxn*maxn][maxn], from[maxn], del;
 198 bool vx[maxn*maxn], vy[maxn];
 199 struct node
 200 {
 201     int x, y;
 202     node(int a=0, int b=0){ x=a, y=b; }
 203 }ph[maxn], pm[maxn*maxn];
 204 
 205 int Dis(int a, int b)
 206 {
 207     return Abs(pm[a].x-ph[b].x)+Abs(pm[a].y-ph[b].y);
 208 }
 209 
 210 bool Dfs(int x)
 211 {
 212     vx[x]=true;
 213     for(int y=1; y<=ch; y++)
 214     {
 215         if(vy[y])   continue;
 216 
 217         int t=lx[x]+ly[y]-w[x][y];
 218         if(!t)
 219         {
 220             vy[y]=true;
 221             if((!from[y])||Dfs(from[y]))
 222             {
 223                 from[y]=x;
 224                 return true;
 225             }
 226         }
 227         else if(del>t)  del=t;
 228     }
 229     return false;
 230 }
 231 
 232 int KM()
 233 {
 234     for(int i=1; i<=cm; i++)
 235     {
 236         while(true)
 237         {
 238             memset(vx, 0, sizeof vx);
 239             memset(vy, 0, sizeof vy);
 240             del=INF;
 241             if(Dfs(i))  break;
 242             for(int j=1; j<=cm; j++)  if(vx[j])   lx[j]-=del;
 243             for(int j=1; j<=ch; j++)  if(vy[j])   ly[j]+=del;
 244         }
 245     }
 246 
 247     int ans=0;
 248     for(int i=1; i<=ch; i++)    if(from[i])    ans+=w[from[i]][i];
 249     return ans;
 250 }
 251 
 252 int main()
 253 {
 254     int T=0;
 255     while(scanf("%d%d", &n, &m)!=EOF&&n+m)
 256     {
 257         ch=cm=0;
 258         memset(ly, 0, sizeof ly);
 259         memset(from, 0, sizeof from);
 260         char s[maxn];
 261 
 262         for(int i=1; i<=n; i++)
 263         {
 264             scanf("%s", s+1);
 265             for(int j=1; j<=m; j++)
 266             {
 267                 if(s[j]==H)   ph[++ch]=node(i, j);
 268                 else if(s[j]==m)  pm[++cm]=node(i, j);
 269             }
 270         }
 271 
 272         for(int i=1; i<=cm; i++)
 273         {
 274             lx[i]=-INF;
 275             for(int j=1; j<=ch; j++)
 276             {
 277                 w[i][j]=-Dis(i, j);
 278                 lx[i]=Min(lx[i], w[i][j]);
 279             }
 280         }
 281         
 282         cout<<-KM()<<endl;
 283     }
 284     return 0;
 285 }
 286 
 287 
 288 
 289 
 290 /**************************************************
 291 
 292             模版:二维树状数组
 293             题目:CQBZ1909 二维区间的和
 294 
 295 **************************************************/
 296 
 297 #include<iostream>
 298 #include<cstdio>
 299 #include<cstring>
 300 #define lowbit(i) ((i)&(-i))
 301 using namespace std;
 302 const int maxn=1500+10;
 303  
 304 int n,a[maxn][maxn];
 305  
 306 void get_int(int &num)
 307 {
 308     char c; bool f=false;
 309     for(; c=getchar(),c<0||c>9; (c==-)&&(f=true));
 310     for(num=c-48; c=getchar(),c>=0&&c<=9; num=num*10+c-48);
 311     f&&(num=-num);
 312     return ;
 313 }
 314  
 315 void Add(int x, int y, int t)
 316 {
 317     for(int i=x+1; i<=n; i+=lowbit(i))
 318         for(int j=y+1; j<=n; j+=lowbit(j))
 319             a[i][j]+=t;
 320     return ;
 321 }
 322  
 323 int Sum(int x,int y)
 324 {
 325     int ans=0;
 326     for(int i=x+1; i; i-=lowbit(i))
 327         for(int j=y+1; j; j-=lowbit(j))
 328             ans+=a[i][j];
 329     return ans;
 330 }
 331  
 332 int main()
 333 {
 334     int d, x1, y1, t, x2, y2;
 335  
 336     scanf("%d%d", &d, &n);
 337     while(scanf("%d",&d)&&d!=3)
 338     {
 339         if(d==1)
 340         {
 341             get_int(x1), get_int(y1), get_int(t);
 342             Add(x1,y1,t);
 343         }
 344         else
 345         {
 346             get_int(x1), get_int(y1), get_int(x2), get_int(y2);
 347             printf("%d\n", Sum(x2,y2)+ Sum(x1-1,y1-1)- Sum(x1-1,y2)- Sum(x2,y1-1));
 348         }
 349     }
 350     return 0;
 351 }
 352 
 353 
 354 
 355 
 356 /**************************************************
 357 
 358             模版:高精度
 359             题目:高精度加减乘除
 360 
 361 **************************************************/
 362 
 363 #include<iostream>
 364 #include<fstream>
 365 #include<cstring>
 366 #include<cstdio>
 367 using namespace std;
 368 typedef long long lint;
 369 const int MAXN=5010;
 370 struct node
 371 {
 372     long long n[MAXN],lim;
 373     node(){ memset(n,0,sizeof(n));n[0]=1LL;lim=10000LL; }
 374     bool operator <(node a) const
 375     {
 376         if(n[0]!=a.n[0])    return n[0]<a.n[0];
 377         for(int i=n[0];i>=1;i--)
 378             if(n[i]!=a.n[i])    return n[i]<a.n[i];
 379         return false;
 380     }
 381     bool operator >(node a) const
 382     {
 383         if(n[0]!=a.n[0])    return n[0]>a.n[0];
 384         for(int i=n[0];i>=1;i--)
 385             if(n[i]!=a.n[i])    return n[i]>a.n[i];
 386         return false;
 387     }
 388     bool operator ==(node a) const
 389     {
 390         if(n[0]!=a.n[0])    return false;
 391         for(int i=1;i<=n[0];i++)
 392             if(n[i]!=a.n[i])    return false;
 393         return true;
 394     }
 395     void operator +=(lint a)
 396     {
 397         n[1]+=a;
 398         for(int i=1;i<=n[0];i++)
 399         {
 400             n[i+1]+=(n[i]/lim);
 401             n[i]%=lim;
 402             if(i==n[0]&&n[i+1])  ++n[0];
 403         }
 404     }
 405     node operator +(lint a)
 406     {
 407         node t=*this;
 408         t+=a;
 409         return t;
 410     }
 411     void operator +=(node a)
 412     {
 413         n[0]=max(n[0],a.n[0]);
 414         for(int i=1;i<=n[0];i++)    n[i]+=a.n[i];
 415         for(int i=1;i<=n[0];i++)
 416         {
 417             n[i+1]+=(n[i]/lim);
 418             n[i]%=lim;
 419             if(i==n[0]&&n[i+1]) ++n[0];
 420         }
 421     }
 422     node operator +(node a)
 423     {
 424         node t=*this;
 425         t+=a;
 426         return t;
 427     }
 428     void operator -=(lint a)
 429     {
 430         n[1]-=a;
 431         for(int i=1;n[i]<0&&i<n[0];i++)
 432             while(n[i]<0)   n[i]+=lim,n[i+1]-=1;
 433         for(;!n[n[0]]&&n[0]>1;--n[0]);
 434     }
 435     node operator -(lint a)
 436     {
 437         node t=*this;
 438         t-=a;
 439         return t;
 440     }
 441     void operator -=(node a)
 442     {
 443         for(int i=1;i<=n[0];i++)
 444         {
 445             if(n[i]<a.n[i]) n[i]+=lim,n[i+1]-=1;
 446             n[i]-=a.n[i];
 447         }
 448         for(;!n[n[0]]&&n[0]>1;--n[0]);
 449     }
 450     node operator -(node a)
 451     {
 452         node t=*this;
 453         t-=a;
 454         return t;
 455     }
 456     void operator *=(lint a)
 457     {
 458         for(int i=1;i<=n[0];i++)    n[i]*=a;
 459         for(int i=1;i<=n[0];i++)
 460         {
 461             n[i+1]+=(n[i]/lim);
 462             n[i]%=lim;
 463             if(i==n[0]&&n[i+1]) ++n[0];
 464         }
 465     }
 466     node operator *(lint a)
 467     {
 468         node t=*this;
 469         t*=a;
 470         return t;
 471     }
 472     void operator *=(node a)
 473     {
 474         node c;
 475         c.n[0]=n[0]+a.n[0]-1;
 476         for(int i=1;i<=n[0];i++)
 477             for(int j=1;j<=a.n[0];j++)
 478                 c.n[i+j-1]+=n[i]*a.n[j];
 479         for(int i=1;i<=c.n[0];i++)
 480         {
 481             c.n[i+1]+=(c.n[i]/以上是关于model的主要内容,如果未能解决你的问题,请参考以下文章

python小知识片段

python小知识片段

Django REST framework序列化

Django管理图标和图像

如何将 List<Model> 从 Activity 传递到 Fragment

Django REST framework 基本组件