套题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; }
gcd
相当于通分
通分之后变成x:y的形式
通分之后变成x:y的形式
a/b*y = c/d*x
x = a*d , y = c*b
y/=gcd(x,y)
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; }
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”,不含引号。
备注