Rikka with Chess
一个n×m的黑白相间的棋盘,每次可以选择一个矩形把其中的所有格子反色。问把所有格子变成一种颜色时的最少操作次数。
第一行一个整数 T(T≤10) 表示数据组数。 每组数据有一行, 两个正整数 n,m(n≤109,m≤109)。
对于每组数据输出一行一个整数,代表最少需要的操作次数。
3 1 2 2 2 3 3
1 2 2第一题的话,直觉肯定要找规律,于是试了几个简单的样例,再猜了一下,发现规律就是n/2+m/2,至于这个结论的证明,sorry,I can't.
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> using namespace std; int t,n,m; int main() { cin>>t; while(t--) { cin>>n>>m; cout<<n/2+m/2<<endl; } return 0; }
众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的: 给出一张 n 个点 n+1 条边的无向图,你可以选择一些边(至少一条)删除。 现在勇太想知道有多少种方案使得删除之后图依然联通。 当然,这个问题对于萌萌哒六花来说实在是太难了,你可以帮帮她吗?
第一行一个整数表示数据组数 T(T≤30)。 每组数据的第一行是一个整数 n(n≤100)。 接下来 n+1 行每行两个整数 u,v 表示图中的一条边。
对每组数据输出一行一个整数表示答案。
1 3 1 2 2 3 3 1 1 3
9
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int a[105],b[105],p[105],g[105],son[105]; int f[105][105],s[105][105]; int tt,t,w,n,ans; int main() { cin>>tt; while(tt--) { cin>>n; ans=0; memset(f,0,sizeof(f)); memset(son,0,sizeof(son)); for(int i=1;i<=n+1;i++) { cin>>a[i]>>b[i]; f[a[i]][b[i]]++; f[b[i]][a[i]]++; son[a[i]]++; son[b[i]]++; s[a[i]][son[a[i]]]=b[i]; s[b[i]][son[b[i]]]=a[i]; } for(int i=1;i<=n+1;i++) for(int j=1;j<=n+1;j++) if(i<=j) { memset(p,0,sizeof(p)); f[a[i]][b[i]]--; f[b[i]][a[i]]--; if(i!=j) { f[a[j]][b[j]]--; f[b[j]][a[j]]--; } int t=0; int w=1; g[1]=1; p[1]=1; while(t<w) { t++; for(int k=1;k<=son[g[t]];k++) { int id=s[g[t]][k]; if(f[g[t]][id]>=1&&p[id]==0) { w++; g[w]=id; p[id]=1; } } } if(t==n) ans++; f[a[i]][b[i]]++; f[b[i]][a[i]]++; if(i!=j) { f[a[j]][b[j]]++; f[b[j]][a[j]]++; } } cout<<ans<<endl; } return 0; }