Tutorials for 2014 SWJTU ACM Summer Training for Freshman
2014-07-08 21:03
525 查看
A题:工兵题。
B题:工兵题。
C题:连长题。
D题:排长题。
E题:排长题。
F题:营长题。
G题:营长题。
请先做500年前的陈题,全国ACMer都知道的题:POJ1011
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=15;
int mat[maxn];
int n, total;
bool sign;
int num[maxn];
bool used[maxn];
bool cmp(int a,int b){
return a>b;
}
void dfs(int index,int ret,int cnt){
if(cnt>total || ret>n)return;
if(ret==n){
sign=true;
for(int i=0;i<cnt;++i){
if(!i)printf("%d", num[i]);
else printf("+%d", num[i]);
}
puts("");
return;
}
for(int i=index,pre=-1;i<total;++i){
if(!used[i] && ret+mat[i]<=n && mat[i]!=pre){
used[i]=true;
num[cnt]=mat[i];
ret+=mat[i];
pre=mat[i];
dfs(i+1, ret, cnt+1);
ret-=mat[i];
used[i]=false;
}
}
}
int main(){
int Test;
scanf("%d", &Test);
while(Test--){
scanf("%d%d", &n, &total);
int sum=0;
for(int i=0;i<total;++i){
scanf("%d", mat+i);
sum+=mat[i];
}
printf("Sums of %d:\n", n);
if(sum<n || n<=0){
puts("NONE");
continue;
}
sort(mat, mat+total, cmp);
sign=false;
memset(used, false, sizeof(used));
dfs(0, 0, 0);
if(!sign)puts("NONE");
}
return 0;
}
H题:团长题。
费用流。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define MaxN (32)
#define MaxM (32)
#define INF (1000000000)
int N, M;
int w[MaxN][MaxM], A[32];
int Xw[MaxN], Yw[MaxM];
int toX[MaxM], toY[MaxN];
bool Xv[MaxN], Yv[MaxM];
int slack[MaxM];
bool augment(int x){
int y;
Xv[x] = true;
for(y=0; y<M; ++y){
if(Yv[y]) continue;
if(Xw[x] + Yw[y] - w[x][y]){
slack[y] = min(slack[y], Xw[x]+Yw[y]-w[x][y]);
continue;
}
Yv[y] = true;
if(toX[y] == -1 || augment(toX[y])){
toX[y] = x; return true;
}
}
return false;
}
int KM(){
int i, j, k, d;
memset(Yw, 0, sizeof(Yw));
for(i=0; i<N; ++i){
Xw[i] = -1000000000;
for(j=0; j<M; ++j)
if(Xw[i] < w[i][j]) Xw[i] = w[i][j];
}
memset(toX, -1, sizeof(toX));
for(k=0; k<N; ++k){
do{
memset(Yv, false, sizeof(Yv));
memset(Xv, false, sizeof(Xv));
memset(slack, 0x7F, sizeof(slack));
if(augment(k)) break;
d = INF;
for(i=0; i<M; ++i) if(!Yv[i])
d = min(d, slack[i]);
for(i=0; i<N; ++i) if(Xv[i]) Xw[i] -= d;
for(i=0; i<M; ++i) if(Yv[i]) Yw[i] += d;
}while(1);
}
for(k=i=0; i<M; ++i)
k += w[toX[i]][i];
return k;
}
int main(){
int i, j, T;
scanf("%d", &T);
while(T--) {
scanf("%d", &N); M = N;
for(i=0; i<N; ++i) for(scanf("%d", A+i),j=1; j<=N; ++j)
w[i][j-1] = ((abs(A[i])&1)==(j&1)) ? A[i]*j : A[i]+j;
printf("%d\n", KM());
}
return 0;
}
#include<stdio.h> int main() { int a, b; while( scanf("%d %d", &a, &b) == 2 ) printf("%d\n", a + b); return 0; }
B题:工兵题。
#include<cstdio> int main() { int n, s, x, t; scanf("%d", &t); while( (t --) > 0 ) { scanf("%d", &n); s = 0; while( (n --) > 0 ) { scanf("%d", &x); s += x; } printf("%d\n\n", s); } return 0; }
C题:连长题。
#include <string.h> #include <stdlib.h> #include <stdio.h> char str[1024]; void print(double v) { sprintf(str, "%.2f", v); if(strcmp(str, "-0.00") == 0) printf("0.00"); else printf("%.2f", v); //if(v < 0.005 && v > -0.005) // v = 0; } int main() { int T, iT, a, b, c, d; double delta, lo, hi, mi; char *p; scanf("%d", &T); for(iT=1; iT<=T; ++iT) { scanf("%d%d%d", &a, &b, &c); printf("Case #%d: ", iT); if(a == 0) { if(b == 0) { if(c == 0) puts("INF"); else puts("0"); continue; } printf("%d\n", 1); print(-c*1.0/b); putchar('\n'); continue; } d = b*b - 4*a*c; if(d < 0) { puts("0"); continue; } if(d == 0) { printf("1\n"); print(-b/(2.0*a)); putchar('\n'); continue; } lo=0, hi=(double)d; while(lo+1e-7 < hi) { mi = (lo + hi) / 2.0; if(mi*mi < d) lo=mi; else hi = mi; } delta = (lo + hi) / 2.0; printf("2\n"); print((-b + (a<0 ? delta : -delta))/(2.0*a)); putchar(' '); print((-b - (a<0 ? delta : -delta))/(2.0*a)); putchar('\n'); } return 0; }
D题:排长题。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char str[120]; int main() { int t, tt; scanf("%d", &t); for(tt = 1; tt <= t; ++tt) { scanf("%s", str); char *p = str; while( p && (p = strstr(str, "football")) ) { strcpy(p, p + 8); } printf("Case #%d: %s\n", tt, strlen(str) == 0 ? "OHaHa" : str); } return 0; }
E题:排长题。
#include<cstdio> #include<cstring> #include<cstdlib> #define maxlen (120) static int idx = 0; char P[maxlen]; char Q[maxlen]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); int Test; for(scanf("%d", &Test); Test > 0; --Test) { scanf("%s %s", P, Q); int ans = 0; char *ptr = P; while( *ptr && (ptr = strstr(ptr, Q)) ) { ++ans; ++ptr; } printf("Case #%d: %d\n", ++idx, ans); } return 0; }
F题:营长题。
#include<iostream> #include<algorithm> #include<functional> #include<string> #include<numeric> #include<set> #include<map> #include<queue> #include<vector> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> using namespace std; //MACROS START #define FOR(i,t,n) for(int i=(t);i< (n);i++) #define FORE(i,t,n) for(int i=(t);i<=(n);i++) #define FORB(i,t,n) for(int i=(t);i>=(n);i--) #define dbg(n) cout<<#n <<" "<<(n)<<endl; #define dbg2(x,y) cout<<#x<<"\t"<<(x)<<"\t"<<#y<<"\t"<<(y)<<endl; //MACROS END const int maxn = 30; static int idx = 0; char s1[maxn], t1[maxn]; char s2[maxn], t2[maxn]; struct point { int x; int y; }; bool check(point p1,point p2,point p3,point p4){ if(max(p1.x,p2.x)<min(p3.x,p4.x)||min(p1.x,p2.x)>max(p3.x,p4.x))return false; if(max(p1.y,p2.y)<min(p3.y,p4.y)||min(p1.y,p2.y)>max(p3.y,p4.y))return false; if(((p3.y-p1.y)*(p2.x-p1.x)-(p3.x-p1.x)*(p2.y-p1.y))* ((p4.y-p1.y)*(p2.x-p1.x)-(p4.x-p1.x)*(p2.y-p1.y))>0)return false; if(((p1.y-p3.y)*(p4.x-p3.x)-(p1.x-p3.x)* (p4.y-p3.y))*((p2.y-p3.y)*(p4.x-p3.x)-(p2.x-p3.x)*(p4.y-p3.y))>0)return false; return true; } char tmp[maxn]; void change(char s[], point &p) { int len = strlen(s); if(s[len-1] == 'i') { if(len == 1) { p.x = 0; p.y = 1; return; } if(s[len-2] >= '0' && s[len-2] <= '9') s[len-1] = 0; else s[len-2] = 1, s[len-1] = 0; //puts(s); len = strlen(s) - 1; while(len > 0 && s[len] <= '9' && s[len] >= '0') --len; strcpy(tmp, s); tmp[len] = 0; p.x = atoi(tmp); strcpy(s, s+len); p.y = atoi(s); return; } else { p.y = 0; p.x = 0; for(int i = 0; i < len; ++i) { if(s[i] >= '0' && s[i] <= '9') { p.x = 10 * p.x + s[i] - '0'; } } if(s[0] == '-') p.x = -p.x; return; } } point p1, p2, p3, p4; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); int Test; scanf("%d", &Test); while(Test--) { scanf("%s %s %s %s", s1, t1, s2, t2); change(s1, p1); //dbg2(p1.x, p1.y); change(t1, p2); //dbg2(p2.x, p2.y); change(s2, p3); //dbg2(p3.x, p3.y); change(t2, p4); //dbg2(p4.x, p4.y); printf("Case #%d: %s\n", ++idx, check(p1, p2, p3, p4) ? "YES" : "NO"); } return 0; }
G题:营长题。
请先做500年前的陈题,全国ACMer都知道的题:POJ1011
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=15;
int mat[maxn];
int n, total;
bool sign;
int num[maxn];
bool used[maxn];
bool cmp(int a,int b){
return a>b;
}
void dfs(int index,int ret,int cnt){
if(cnt>total || ret>n)return;
if(ret==n){
sign=true;
for(int i=0;i<cnt;++i){
if(!i)printf("%d", num[i]);
else printf("+%d", num[i]);
}
puts("");
return;
}
for(int i=index,pre=-1;i<total;++i){
if(!used[i] && ret+mat[i]<=n && mat[i]!=pre){
used[i]=true;
num[cnt]=mat[i];
ret+=mat[i];
pre=mat[i];
dfs(i+1, ret, cnt+1);
ret-=mat[i];
used[i]=false;
}
}
}
int main(){
int Test;
scanf("%d", &Test);
while(Test--){
scanf("%d%d", &n, &total);
int sum=0;
for(int i=0;i<total;++i){
scanf("%d", mat+i);
sum+=mat[i];
}
printf("Sums of %d:\n", n);
if(sum<n || n<=0){
puts("NONE");
continue;
}
sort(mat, mat+total, cmp);
sign=false;
memset(used, false, sizeof(used));
dfs(0, 0, 0);
if(!sign)puts("NONE");
}
return 0;
}
H题:团长题。
费用流。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define MaxN (32)
#define MaxM (32)
#define INF (1000000000)
int N, M;
int w[MaxN][MaxM], A[32];
int Xw[MaxN], Yw[MaxM];
int toX[MaxM], toY[MaxN];
bool Xv[MaxN], Yv[MaxM];
int slack[MaxM];
bool augment(int x){
int y;
Xv[x] = true;
for(y=0; y<M; ++y){
if(Yv[y]) continue;
if(Xw[x] + Yw[y] - w[x][y]){
slack[y] = min(slack[y], Xw[x]+Yw[y]-w[x][y]);
continue;
}
Yv[y] = true;
if(toX[y] == -1 || augment(toX[y])){
toX[y] = x; return true;
}
}
return false;
}
int KM(){
int i, j, k, d;
memset(Yw, 0, sizeof(Yw));
for(i=0; i<N; ++i){
Xw[i] = -1000000000;
for(j=0; j<M; ++j)
if(Xw[i] < w[i][j]) Xw[i] = w[i][j];
}
memset(toX, -1, sizeof(toX));
for(k=0; k<N; ++k){
do{
memset(Yv, false, sizeof(Yv));
memset(Xv, false, sizeof(Xv));
memset(slack, 0x7F, sizeof(slack));
if(augment(k)) break;
d = INF;
for(i=0; i<M; ++i) if(!Yv[i])
d = min(d, slack[i]);
for(i=0; i<N; ++i) if(Xv[i]) Xw[i] -= d;
for(i=0; i<M; ++i) if(Yv[i]) Yw[i] += d;
}while(1);
}
for(k=i=0; i<M; ++i)
k += w[toX[i]][i];
return k;
}
int main(){
int i, j, T;
scanf("%d", &T);
while(T--) {
scanf("%d", &N); M = N;
for(i=0; i<N; ++i) for(scanf("%d", A+i),j=1; j<=N; ++j)
w[i][j-1] = ((abs(A[i])&1)==(j&1)) ? A[i]*j : A[i]+j;
printf("%d\n", KM());
}
return 0;
}
相关文章推荐
- Tutorials for 2014 SWJTU ACM Summer Training Team-PK Contest #1
- Tutorials for 2014 SWJTU Freshman Invitation Programming Contest - Online Round
- 2015 SWJTU ACM Summer Training Final Assessment 1st 部分题解
- The 3rd ACM-ICPC Summer Training Contest(swjtu)
- 2014 UESTC Training for Search Algorithm I
- 2014 UESTC Training for Graph Theory C
- 2014 UESTC Training for Search Algorithm J
- 2014 UESTC Training for Graph Theory F
- 2014 UESTC Training for Search Algorithm K
- UESTC 2014 Summer Training #18 Div.2
- 2014 UESTC Training for Graph Theory G
- 2017 Xian ACM Summer Training Warm-up Exercise 3
- 2014 UESTC Training for Search Algorithm L
- UESTC 2014 Summer Training #19
- 2014 UESTC Training for Graph Theory H
- IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 Industry Track Call for Papers
- 2014 UESTC Training for Data Structures—— E - 休生伤杜景死惊开
- 2014 UESTC Training for Graph Theory I
- 2014 UESTC Training for Graph Theory Problem K WHITE ALBUM
- 2014 UESTC Training for Graph Theory J