您的位置:首页 > 大数据 > 人工智能

Tutorials for 2014 SWJTU ACM Summer Training for Freshman

2014-07-08 21:03 525 查看
A题:工兵题。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Trainning