套题T7

P4712 铺瓷砖
时间: 1000ms / 空间: 65536KiB / Java类名: Main
 

描述

输入格式

输出格式

备注


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int t;

ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}

ll gcd(ll a,ll b) 
{
    return b ? gcd(b,a%b) : a;
}

int main()
{
    freopen("tile.in","r",stdin);
    freopen("tile.out","w",stdout);
    int a,b,c,d;
    ll x,y;
       t=read();
    for(int i=1;i<=t;++i)
    {
        a=read();b=read();c=read();d=read();
        x=a*d,y=c*d;
        ll tmp=gcd(x,y);
        x=(y/tmp)*a;
        y=b;
        tmp=gcd(x,y);
        x/=tmp,y/=tmp;
        if(x==1)printf("%lld",x);
        else printf("%lld/%lld",x,y);
        puts("");
    }
    fclose(stdin);fclose(stdout);
    return 0;
}
QAQ

gcd

相当于通分
通分之后变成x:y的形式  
a/b*y = c/d*x
x = a*d , y = c*b
y/=gcd(x,y)
ans = y*a/b
所以ans = y*a , tmp=gcd(ans,b) , ans/=tmp , b/=tmp , printf()

 

 

 


P4713 小Y的问题
时间: 1000ms / 空间: 65536KiB / Java类名: Main

描述

输入格式

         第一行包含一个整数n,表示无向图的点数。

         接下来n-1行,每行有3个整数x、y、z,表示编号为x和y的点之间有一条长度为z的边。

 

输出格式

备注


 想法其实就是枚举每个y形的中间那个点//就是三叉路口

然后对于每个三叉路口,就是枚举连出去的所有链然后直接统计答案

 

                     #include <stdio.h>
#include <memory.h>
inline int max(register int a , register int b) { return a > b ? a : b ; }
inline int F() 
{ 
register int aa , bb , ch;
    while(ch = getchar() , (ch<'0'||ch>'9') && ch != '-'); ch == '-' ? aa=bb=0 : (aa=ch-'0',bb=1);
    while(ch = getchar() , ch>='0'&&ch<='9') aa = aa*10 + ch-'0'; return bb ? aa : -aa;
}
const int Maxn = 200010;
const int Maxm = 400010;
#define R register
int n , to[Maxm] , next[Maxm] , g[Maxn] , mx[Maxn][4] , w[Maxm] , ecnt = 1 , du[Maxn] , xl[Maxn][3] , ll[Maxn][3];
inline void ins(R int a , R int b , R int wi) 
{
    to[++ecnt] = b; next[ecnt] = g[a]; g[a] = ecnt; w[ecnt] = wi; ++du[a];
    to[++ecnt] = a; next[ecnt] = g[b]; g[b] = ecnt; w[ecnt] = wi; ++du[b];
}
int main()
 {
    n = F();
    memset(mx,-1,sizeof(mx));
    memset(ll,-1,sizeof(ll));
    for(R int i=1; i<n; ++i)
     {
        R int a = F() , b = F() , x = F();
        ins(a,b,x);
        if(x > w[mx[a][3]])
        {
            if(x > w[mx[a][2]])
            {
                if(x > w[mx[a][1]])
                {
                    mx[a][3] = mx[a][2];
                    mx[a][2] = mx[a][1];
                    mx[a][1] = ecnt-1;
                }
                else 
                {
                    mx[a][3] = mx[a][2];
                    mx[a][2] = ecnt-1;
                }
            }
            else mx[a][3] = ecnt-1;
        }
        if(x > w[mx[b][3]]) 
        {
            if(x > w[mx[b][2]]) 
            {
                if(x > w[mx[b][1]]) 
                {
                    mx[b][3] = mx[b][2];
                    mx[b][2] = mx[b][1];
                    mx[b][1] = ecnt;
                }
                else
                {
                    mx[b][3] = mx[b][2];
                    mx[b][2] = ecnt;
                }
            }
            else mx[b][3] = ecnt;
        }
    }
    int tmp = 0 , ans = 0; long long anscnt = 0;
    for(int i=1; i<=n; ++i) 
    {
        if(du[i] > 2) 
        {
            for(int j=g[i]; j; j=next[j]) 
            {
                if(du[to[j]] < 2) continue;
                anscnt += (((long long)du[i]-1)*(du[i]-2)/2)*(du[to[j]]-1);
                if(j == (mx[to[j]][1]^1)) tmp = w[j]+w[mx[to[j]][2]];
                else tmp = w[j]+w[mx[to[j]][1]];
                if(tmp > ll[i][2]) 
                {
                    if(tmp > ll[i][1]) 
                    {
                        ll[i][2] = ll[i][1];
                        xl[i][2] = xl[i][1];
                        ll[i][1] = tmp;
                        xl[i][1] = j;
                    }
                    else {
                        ll[i][2] = tmp;
                        xl[i][2] = j;
                    }
                }
            }
            if(!xl[i][2]) 
            {
                if(xl[i][1]) 
                {
                    if(xl[i][1] == mx[i][1]) ans = max(ans , ll[i][1]+w[mx[i][2]]+w[mx[i][3]]);
                    else if(xl[i][1] == mx[i][2]) ans = max(ans , ll[i][1]+w[mx[i][1]]+w[mx[i][3]]);
                    else ans = max(ans , w[mx[i][1]]+w[mx[i][2]]+ll[i][1]);
                }
                continue;
            }
            if(xl[i][1] == mx[i][1]) 
            {
                ans = max(ans , ll[i][1]+w[mx[i][2]]+w[mx[i][3]]);
                if(xl[i][2] == mx[i][2])
                     ans = max(ans , w[mx[i][1]] + w[mx[i][3]] + ll[i][2]);
                else ans = max(ans , w[mx[i][1]] + w[mx[i][2]] + ll[i][2]);
            }
            
            else 
            {
                if(xl[i][1] == mx[i][2]) 
                {
                    ans = max(ans , w[mx[i][1]]+w[mx[i][3]] + ll[i][1]);
                    if(xl[i][2] == mx[i][1])
                        ans = max(ans , w[mx[i][2]]+w[mx[i][3]]+ll[i][2]);
                    else ans = max(ans , w[mx[i][1]]+w[mx[i][2]]+ll[i][2]);
                }
                else ans = max(ans , w[mx[i][1]]+w[mx[i][2]]+ll[i][1]);
            }
        }
    }
    printf("%lld\n%d",anscnt,ans);
    return 0;
}               
View Code

 

 

 


P4714 水管工的难题
时间: 1000ms / 空间: 65536KiB / Java类名: Main

背景

(plumber.cpp/c/pas)

描述

输入格式

输入的第1行包含4个正整数X,Y,Z,m,其中X,Y,Z表示房间的长、高、宽,m表示房间中物品的数量。

         输入的第2行包含3个正整数x1,y1,z1,和一个字符ch。其中(x1,y1,z1)是水管入口所在的小立方体的坐标。ch的值为'x'、'y'或'z',用于指示入口所在的面。当ch为'x'时,表示入口所在的面与YZ坐标平面平行,当ch为'y'时,表示入口所在的面与XZ坐标平面平行,当ch为'z'时,表示入口所在的面与XY坐标平面平行。输入保证入口所在的面在长方体表面上。数字和数字、数字和字符间用一个空格隔开。

         输入的第3行包含3个正整数x2,y2,z2,和一个字符ch,表示水管出口的位置,意义与格式同上。

         接下来m行,每行包含三个正整数xi,yi,zi,表示在坐标(xi,yi,zi)的小立方体空间内有物品。

输出格式

         输出包含1个整数,表示最少使用的水管部件的数量。如果不能完成接水管的任务,输出“impossible”,不含引号。

备注


 

 

 

 

 

 

posted @ 2016-09-24 14:44  pandaB  阅读(212)  评论(0编辑  收藏  举报