2013 通化邀请赛ABCDEGHIJ题解
A:
#include <cstdio> #include <cstring> int main() { int T; scanf("%d", &T); while(T --) { double x, ans = 0; for(int i = 0; i < 12;i ++) { scanf("%lf", &x); ans += x; } ans /= 12; char b[1000]; sprintf(b,"%.2f", ans); int len = strlen(b); if(b[len-1] == '0' && b[len-2] == '0') b[len-3] = '\0'; else if(b[len-1] == '0') b[len-1] = '\0'; printf("$%s\n", b); } return 0; }B:
==明天再上代码,。
C:
#include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <map> #include <stack> #include <iostream> #include <vector> #include <algorithm> using namespace std; #define N 505 char mp[N][N]; int n,m; int dp[N][N][4]; void work(){ //** //* for(int i = n-1; i>= 1; i--) for(int j = m-1; j >= 1; j--) { int tmp = 1; for(int k = 1; i+k<=n && j+k<=m ; k++) { if(mp[i+k][j]==mp[i][j+k]) tmp++; else break; } dp[i][j][3] = min(tmp, dp[i+1][j+1][3]+2); } //** // * for(int i = n-1; i >= 1; i--) for(int j = 2; j <= m; j++) { int tmp = 1; for(int k = 1; i+k<=n && j-k>0 ; k++) { if(mp[i+k][j]==mp[i][j-k]) tmp++; else break; } dp[i][j][2] = min(tmp, dp[i+1][j-1][2]+2); } //* //** for(int i = 2; i <= n; i++) for(int j = m-1; j >= 1; j--) { int tmp = 1; for(int k = 1; i-k>0 && j+k<=m ; k++) { if(mp[i-k][j]==mp[i][j+k]) tmp++; else break; } dp[i][j][1] = min(tmp, dp[i-1][j+1][1]+2); } // * //** for(int i = 2; i <= n; i++) for(int j = 2; j <= m; j++) { int tmp = 1; for(int k = 1; i-k>0 && j-k>0 ; k++) { if(mp[i-k][j]==mp[i][j-k]) tmp++; else break; } dp[i][j][0] = min(tmp, dp[i-1][j-1][0]+2); } } int main() { int i,j,k,T;scanf("%d",&T); while (T--) { scanf("%d%d",&n,&m); for(i = 1; i<= n; i++) scanf("%s",mp[i]+1); memset(dp, 0, sizeof dp); work(); for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) for(k = 0; k < 4; k++) dp[i][j][k] = max(dp[i][j][k], 1); int ans = 0; for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) for(k = 0; k < 4; k++) { int len = dp[i][j][k]; len = ((len+1)*len)/2; ans = max(ans, len); } cout<<ans<<endl; } return 0; }D:
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <set> #include <vector> using namespace std; typedef int ll; #define N 100010 ll n, m; ll f[N]; ll find(ll x){return x==f[x]?x:f[x]=find(f[x]);} bool Union(ll x, ll y){ ll fx = find(x), fy = find(y); if(fx==fy)return false; if(fx>fy)swap(fx,fy); f[fx] = fy; return true; } struct node{ int from ,to; }edge[100010]; vector<int>ans; int main() { ll u,v,i,j; while(~scanf("%d %d",&n,&m)) { ans.clear(); for(i = 0; i < n; i++)f[i] = i; for(i = 1; i <= m; i++) { scanf("%d %d",&edge[i].from, &edge[i].to); } int now = n; for(i = m; i >= 1; i--) { ans.push_back(now); u = edge[i].from, v = edge[i].to; if(Union(u,v)) now--; } for(i = ans.size()-1; i>=0;i--) printf("%d\n",ans[i]); } return 0; }E:
#include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <map> #include <stack> #include <iostream> #include <algorithm> #include <vector> typedef long long ll; const int N = 100000; std::vector<int> prime; void prepare() { bool vis[N]; for (int i = 2; i < N; ++i) if (!vis[i]) { prime.push_back(i); if ((ll)i * i >= N) continue; for (int j = i * i; j < N; j += i) vis[j] = true; } } int main() { prepare(); int t, g, l, v, x; scanf("%d", &t); while (t -- > 0) { scanf("%d%d", &g, &l); if (g == 0 || l % g != 0 || g > l) { puts("0"); } else { x = v = l / g; ll ans = 1; for (int i = 0; i < prime.size(); ++i) { if ((ll)prime[i] * prime[i] > x) break; if (v % prime[i] == 0) { int cnt = 0; while (v % prime[i] == 0) { v /= prime[i]; ++cnt; } ans = ans * 6 * cnt; } } if (v != 1) { ans *= 6; } printf("%I64d\n", ans); } } return 0; }G:
#include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <map> #include <stack> #include <iostream> #include <algorithm> const int N = 6; int up[N][N], lef[N][N], vis[N][N]; int r, c, ans; void dfs(int i, int j, int cnt) { if (i == r && j == c + 1) { if (cnt > ans) ans = cnt; } else if (j == c + 1) dfs(i + 1, 1, cnt); else { //not put if (!vis[i][j]) { lef[i][j] = lef[i][j - 1]; up[i][j] = up[i - 1][j]; dfs(i, j + 1, cnt); } //put if (vis[i][j]) { if (up[i - 1][j] == 1 || up[i - 1][j] == 3) up[i][j] = 2; else up[i][j] = 0; if (lef[i][j - 1] == 1 || lef[i][j - 1] == 3) lef[i][j] = 2; else lef[i][j] = 0; dfs(i, j + 1, cnt); } else { if (up[i - 1][j] == 2 || lef[i][j - 1] == 2 || up[i - 1][j] == 3 || lef[i][j - 1] == 3) return ; if (up[i - 1][j] == 1) up[i][j] = 3; else up[i][j] = 1; if (lef[i][j - 1] == 1) lef[i][j] = 3; else lef[i][j] = 1; dfs(i, j + 1, cnt + 1); } } } void work() { ans = 0; memset(lef, 0, sizeof lef); memset(up, 0, sizeof up); dfs(1, 1, 0); printf("%d\n", ans); } int main() { int m, x, y; while (~scanf("%d%d", &r, &c)) { memset(vis, 0, sizeof vis); scanf("%d", &m); while (m -- > 0) { scanf("%d%d", &x, &y); ++ x; ++ y; vis[x][y] = true; } work(); } return 0; }
H:
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <set> #include <vector> using namespace std; typedef int ll; #define inf 100000000 #define N 40 ll n, m; int a[N],b[N],sa[N],sb[N]; int x[N][N][N][N]; int dfs(int al, int ar, int bl, int br){ //先手面对这个局势时能获得的最大价值 if(x[al][ar][bl][br]!=-1) return x[al][ar][bl][br]; if(al>ar && bl>br) return 0; int c[4] = {0}; int A, ans = 0, sum = sa[ar]-sa[al-1] + sb[br]-sb[bl-1]; if(al<=ar) { c[0] = dfs(al+1, ar, bl, br); c[1] = dfs(al, ar-1, bl, br); A = sum - c[0]; ans = max(ans, A); A = sum - c[1]; ans = max(ans, A); } if(bl<=br) { c[2] = dfs(al, ar, bl+1, br); c[3] = dfs(al, ar, bl, br-1); A = sum - c[2]; ans = max(ans, A); A = sum - c[3]; ans = max(ans, A); } x[al][ar][bl][br] = ans; return ans; } int main() { ll u,v,i,j,T;scanf("%d",&T); while(T--) { memset(x, -1, sizeof x); scanf("%d",&n); for(i = 1; i <= n; i++)scanf("%d",&a[i]); for(i = 1; i <= n; i++)scanf("%d",&b[i]); sa[0] = sb[0] = 0; for(i = 1; i <= n; i++) { sa[i] = sa[i-1]+a[i]; sb[i] = sb[i-1]+b[i]; } // for(i = 1; i <= n; i++)printf("%d ",sa[i]); puts(""); // for(i = 1; i <= n; i++)printf("%d ",sb[i]); puts(""); printf("%d\n",dfs(1,n,1,n)); } return 0; }I:
无码。。
J:
#include<cstdio> const int mod = 2011; const int e1 = 1944,e2 = 1609;//30,5的逆元 inline int qPow(int x,int p) { int a=6,ans=1; while(x) { if(x&1) ans = ans*a%p; a = a*a%p; x >>= 1; } return ans; } int main() { int n,tmp,tmp1,tmp2,ans1,ans2; while(scanf("%d",&n),n) { tmp = qPow(n,mod); tmp1 = (tmp+24+mod)%mod; tmp2 = (tmp-1+mod)%mod; ans1 = tmp1*e1%mod; ans2 = tmp2*e2%mod; printf("%d %d\n",ans1,ans2); } return 0; }