SCU 2011 warmup contest 2 —— A B C

    技术2022-05-20  60

    呃。。。E题纠结死活出不来。。。总排名第九。。。哎。。还是很水啊。。。

     

    A

     

    给你皮艇的进度,让你排下名。开始这题太长了,就去看C了,结果C纠结完了,AB已经过了好多人了,YM。。。水题。

     

    #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; int main() { int n,m; char str[60][60]; int rank[60],i,k; while( ~scanf("%d%d",&n,&m) ) { memset(rank,-1,sizeof(rank)); for(i=1; i<=n; i++) scanf("%s",str[i]); int r = 1; int flag = 0; for(i=m-2; i>=1; i--) { if( flag ) r++; flag = 0; for(k=1; k<=n; k++) { if( isdigit(str[k][i]) && rank[str[k][i] - '0'] == -1 ) { rank[str[k][i] -'0'] = r; flag = 1; } } } for(i=1; i<=n; i++) if( rank[i] != -1 ) printf("%d/n",rank[i]); } return 0; }  

     

     

    又是游艇。。。又是那俩名字。。。

     

    如果编号为n的队伍游艇坏了,可以向旁边俩队借,当然前提是俩队都有备用皮艇。。。

     

    第一反应,最小顶点覆盖。 = =。。

     

    WA了一次,如果n队坏了,n队友皮艇,就不用借了,如果输入的都是这种情况,就不用用匈牙利算法了,直接输出0.。。

     

    #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> #define MAX 20 using namespace std; int map[20][20]; int mat[MAX],used[MAX]; int n; bool Augment(int x) { int i; for(i=1; i<=n; i++) if( !used[i] && map[x][i] ) { used[i] = 1; if( mat[i] == 0 || Augment(mat[i]) ) { mat[i] = x; return true; } } return false; } int Hungary() { int i,match = 0; memset(mat,0,sizeof(mat)); for(i=1; i<=n; i++) { memset(used,0,sizeof(used)); if( Augment(i) ) match++; } return match; } int main() { int s,r,ans,i,k; while( ~scanf("%d%d%d",&n,&s,&r) ) { memset(map,0,sizeof(map)); int need[MAX]; memset(need,0,sizeof(need)); for(i=1; i<=s; i++) { scanf("%d",&k); need[k] = 1; map[k][k-1] = 1; map[k][k+1] = 1; } int re[MAX]; memset(re,0,sizeof(re)); int sum = 0; for(i=1; i<=r; i++) { scanf("%d",&k); if( need[k] != 1 ) re[k] = 1; else sum++; } if( sum == s ) { printf("0/n"); continue; } for(i=1; i<=n; i++) if( re[i] == 0 ) for(k=1; k<=n; k++) map[k][i] = 0; ans = Hungary(); printf("%d/n",s-ans-sum); } return 0; }  

     

     

    我纠结的第一道题,第二个图是字母ascii码16进制表示,下面是数字表示,我枚举了下,发现字母和数字异或都在一个范围内,.和空格和数字异或在另一个范围内,由此判断下即可

     

    #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; int base(char* str) { int len = strlen(str); int sum = 0,i; for(i=len-1; i>=0; i--) { if( isdigit(str[i]) ) sum += (str[i]-'0') * (int)pow(16,len-i-1); else sum += (str[i]-'a' + 10)*(int)pow(16,len-i-1); } return sum; } int main() { int n; int a[1010],flag[1010]; int p,i; char str[56]; while( ~scanf("%d",&n) ) { memset(flag,0,sizeof(flag)); for(i=0; i<n; i++) { scanf("%s",str); a[i] = base(str); } for(i=0; i<n; i++) if(a[i] > 40 ) putchar('-'); else printf("."); printf("/n"); } return 0; }  

     

    共计A掉3题,rank 9。


    最新回复(0)