宁波工程学院校赛解题报告

来源:互联网 发布:淘宝网店营销策划方案 编辑:程序博客网 时间:2024/06/09 18:48
宁波校赛解题报告(by 「D.Ten)//OJ:http://acm.nbut.cn///NBUT2012校赛I(東方Project專題) 网络同步赛 (共9题  目前AC8题)PS: 剩1题 H题(1121):几何(没学)//A [1114] Alice's Puppets//邻接矩阵 125MS#include<iostream>#include<string>#include<queue>using namespace std;#define N 2005#define M 25int n,cnt;int map[N][N],visit[N];queue<int>Q;struct node{char name[M];int num;}arr[N];int add(char x[]){int i;for(i = 1; i <= cnt; ++i)if(!strcmp(arr[i].name,x))return i;strcpy(arr[++cnt].name,x);return cnt;}int cmp(const void *a,const void *b){if((*(node *)a).num != (*(node *)b).num)return (*(node *)a).num - (*(node *)b).num;return strcmp((*(node *)a).name,(*(node *)b).name);}int main(){int i;int a,b;char c1[M],c2[M];while(scanf("%d",&n)!=EOF){cnt = 0;memset(map,0,sizeof(map));memset(visit,0,sizeof(visit));for(i = 1; i <= n; ++i){scanf("%s %s",c1,c2);a = add(c1);b = add(c2);map[b][a] = 1;}int s = add("Alice");Q.push(s);arr[s].num = 0;while(!Q.empty()){int p =Q.front();Q.pop();visit[p] = 1;for(i = 1; i <= cnt; ++i)if(map[p][i] && !visit[i]){arr[i].num = arr[p].num + 1;visit[i]  = 1;Q.push(i);}}qsort(arr+1,cnt,sizeof(arr[0]),cmp);for(i = 2; i <= cnt; ++i)printf("%s %d\n",arr[i].name,arr[i].num);}return 0;}//A [1114] Alice's Puppets//邻接表 31MS#include<iostream>#include<string>#include<queue>using namespace std;#define N 2005#define M 25int n,cnt;int visit[N];int head[N],num;queue<int>Q;struct node{char name[M];int num;}arr[N];struct Edge{int from;int to;int next;}edge[N*N];void addedge(int from, int to){edge[num].from = from;edge[num].to = to;edge[num].next = head[from];head[from] = num++;}int add(char x[]){int i;for(i = 1; i <= cnt; ++i)if(!strcmp(arr[i].name,x))return i;strcpy(arr[++cnt].name,x);return cnt;}int cmp(const void *a,const void *b){if((*(node *)a).num != (*(node *)b).num)return (*(node *)a).num - (*(node *)b).num;return strcmp((*(node *)a).name,(*(node *)b).name);}int main(){int i;int a,b;int q,u;char c1[M],c2[M];while(scanf("%d",&n)!=EOF){cnt = num =0;memset(visit,0,sizeof(visit));memset(head,-1,sizeof(head));for(i = 1; i <= n; ++i){scanf("%s %s",c1,c2);a = add(c1);b = add(c2);addedge(b,a);}int s = add("Alice");Q.push(s);arr[s].num = 0;while(!Q.empty()){int p =Q.front();Q.pop();visit[p] = 1;for(q = head[p]; q!=-1; q= edge[q].next){u = edge[q].to;if(!visit[u]){arr[u].num = arr[p].num + 1;visit[u]  = 1;Q.push(u);}}}qsort(arr+1,cnt,sizeof(arr[0]),cmp);for(i = 2; i <= cnt; ++i)printf("%s %d\n",arr[i].name,arr[i].num);}return 0;}//B [1115] Cirno's Trick#include<iostream>#include<stdlib.h>using namespace std;#define N 10double arr[N];int cmp( const void *a , const void *b ){return *(double *)a > *(double *)b ? 1 : -1;}int main(){int i,n;while(scanf("%d",&n)!=EOF){for(i = 0; i < n ; ++i )scanf("%lf",&arr[i]);qsort(arr,n,sizeof(arr[0]),cmp);double ans = 0;for(i = 1 ; i < n-1; ++ i)ans += arr[i];printf("%.2lf\n",ans/(n-2));}return 0;}//C [1116] Flandre's Passageway 【DP  最长上升子序列】#include<iostream>#include<cmath>#include<stdlib.h>#include <algorithm>using namespace std;#define N 2005int n,m,k;struct node{int x;int y;}arr[N];int cmp(node a,node b) {return a.x < b.x;}int dp[N];int LIS(int n){int i,j;for(i=1; i<=n; ++i)dp[i] = 0;int ans;dp[1] = 1;for(i=2; i<=n; ++i){ans = dp[i];for(j=1; j<i; ++j){if(arr[i].x>arr[j].x && arr[i].y>arr[j].y && dp[j]>ans)ans = dp[j];}dp[i] = ans+1;}ans = 0;for(i=1; i<=n; ++i){if(dp[i] > ans)ans = dp[i];}return ans;}int main(){int i,j;while(scanf("%d %d %d",&n,&m,&k)!=EOF){for(i =1; i <= k; ++i)scanf("%d %d",&arr[i].x,&arr[i].y);sort(arr+1,arr+1+k,cmp);int max = LIS(k);double bx = (n+m-2*max)*100+sqrt(2.0)*100*max;printf("%d\n",(int)(bx+0.5));}return 0;}/*4 551 13 22 25 26 3max = 3*///D [1117] Kotiya's Incantation/*check: '-'作为结束符 回车则是下一个数据的第一个GM的提示:a-a-\na-a- 那么第一组数据是SAME而第二组是SIMILAR,至于为什么,想想回车就知道啦*/#include<iostream>using namespace std;#define Min(a,b) ((a<b)?(a):(b))#define Max(a,b) ((a>b)?(a):(b))#define N 10000char a[N],b[N];int cnt1,cnt2;char c;int main(){int i,j;int flag;cnt1 = cnt2 = -1;flag = 0;while(scanf("%c",&c)!=EOF){while(c!='-'){a[++cnt1] = c;scanf("%c",&c);}a[cnt1+1] = '\0';scanf("%c",&c);while(c!='-'){b[++cnt2] = c;scanf("%c",&c);}b[cnt2+1] = '\0';if(!strcmp(a,b))printf("SAME\n");else{for(i = 0,j = -1; i <= cnt1; ++i)if(('a' <= a[i] && a[i] <= 'z')||('A' <= a[i] && a[i] <= 'Z'))a[++j] = a[i];cnt1 = j;a[cnt1+1] = '\0';for(i  = 0 ,j = -1; i <= cnt2 ; ++i)if(('a' <= b[i] && b[i] <= 'z')||('A' <= b[i] && b[i] <= 'Z'))b[++j] = b[i];cnt2 = j;b[cnt2+1] = '\0';if(!strcmp(a,b))printf("SIMILAR\n");elseprintf("DIFFERENT\n");}c = getchar();cnt1 = cnt2 = -1;if(c == -1)flag = 1;else {if(c!='-')a[++cnt1] = c;}if(flag)break;}return 0;}//E [1118] Marisa's Affair#include<iostream>#include<string>#include <algorithm>#include<stdlib.h>using namespace std;#define N 5005#define M 25struct node{char name[M];int num;int x;}arr[N];int n,cnt;void add(char x[],int y){int i;for(i = 0; i <= cnt; ++i)if(!strcmp(arr[i].name,x)){arr[i].num += y;arr[i].x++;break;}if(i>cnt){strcpy(arr[++cnt].name,x);arr[i].num = y;arr[i].x = 1;}}int cmp(const void *a, const void *b){if((*(node *)b).num != (*(node *)a).num)return (*(node *)b).num - (*(node *)a).num;if((*(node *)b).x != (*(node *)a).x)return (*(node *)b).x - (*(node *)a).x;return strcmp((*(node *)a).name,(*(node *)b).name);}int main(){char temp[M];int num,i,j;while(scanf("%d",&n)!=EOF){cnt = 0;for(j =1; j <= n; ++j){scanf("%s %d",temp,&num);add(temp,num);}qsort(arr+1,cnt,sizeof(arr[0]),cmp);printf("%d\n",cnt);for(i =1; i <= cnt; ++i)printf("%s %d %d\n",arr[i].name,arr[i].num,arr[i].x);}return 0;}//F [1119] Patchouli's Books/*解题思路:全排列 输出时对每一位加权判重复越前面的加的权值越大*/#include<iostream>#include<algorithm> using namespace std; int v[10],num[10],ran[10]; long long now,temp;long long pow(long long x,long long y){int i;if(y == 0)return 1;for(i = 1; i <= y; ++i)x *= 16;return x;}void DFS(int deep,int n){int i; if(deep == n){int b =0;temp = 0;for(i = 0; i < n; ++i)temp += num[ran[i]]*pow((long long)1,(long long)n-i);if(temp > now){now = temp;for(i = 0 ; i < n; i++) { if(i < n-1)printf("%X ",num[ran[i]]);elseprintf("%X\n",num[ran[i]]);} }return ;     }  for(i = 0;i < n;i++){ if(v[i]==0){ ran[deep] = i; v[i] = 1; DFS(deep+1,n); v[i] = 0; } } } int main(){int n,i;while(scanf("%d",&n)!=EOF){for(i = 0;i < n;i++){v[i] = 0; scanf("%d",&num[i]);}now = 0;sort(num,num+n); DFS(0,n);} return 0; } //G [1120] Reimu's Teleport//线段树 成段替换 区间求和/*解题思路线段树叶子结点中0表示top1表示向右1000000表示向左查询的结果ans向左:ans/1000000向右:ans%1000000向上:区间长度减去上面那两个*/#include<stdio.h>#include<string.h>#define N 100005#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,r//#define int64 __int64#define int64 long longint m,n;int64 sum[N<<2];int64 add[N<<2];void pushup(int rt){sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void pushdown(int rt,int m){if(add[rt]){add[rt<<1] = add[rt];add[rt<<1|1] = add[rt];sum[rt<<1] = add[rt] * (m-(m>>1));sum[rt<<1|1] = add[rt] * (m>>1);add[rt] = 0;}}void update(int rt, int l,int r, int L,int R,int c){if(L <= l && R >= r){add[rt] = c;sum[rt] = (int64)c * (r-l+1);return ;}pushdown(rt,r-l+1);int mid = (l + r) >> 1;if(L <= mid) update(lson,L,R,c);if(R > mid) update(rson,L,R,c);pushup(rt);}int64 query(int rt,int l,int r, int L,int R){if(L <= l && R >= r)return sum[rt];pushdown(rt,r-l+1);int mid = ( r + l) >>1;int64 res = 0;if(L <= mid) res += query(lson,L,R);if(R > mid) res +=  query(rson,L,R);return res;}void print(int n){int i;for(i = 0; i <= n; ++i)printf("sum[%d]: %I64d\n",i,sum[i]);puts("");}int main(){int i;int a,b;char op[5];while(scanf("%d %d",&m,&n)!=EOF){memset(sum,0,sizeof(sum));memset(add,0,sizeof(add));//print(30);for(i = 1; i <= m; ++i){scanf("%s %d %d",op,&a,&b);if(op[0] == 'F'){if(a < b)update(1,1,n,a,b,1);elseupdate(1,1,n,b,a,1000000);//print(30);}else{int64 ans = query(1,1,n,a,b);int64 l = ans/1000000;int64 r = ans%1000000;int64 t = b-a+1-l-r;//printf("%I64d %I64d %I64d\n",l,t,r);printf("%lld %lld %lld\n",l,t,r);}}}return 0;}//I  [1122] Shameimaru's Candid Camera 【N,M 给的是相反的 输出时 每组数据间要加空行】#include<iostream>using namespace std;#define N 505char map[N][N];int ans[N][N];int dir[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};int n,m;bool check(int x,int y){if(x >= 1 && x <= n && y >= 1 && y <= m)return true;return false;}int main(){int i,j,k,ca=1;int x,y;memset(map,0,sizeof(map));memset(ans,0,sizeof(ans));while(scanf("%d %d",&m,&n)!=EOF){if(ca != 1)printf("\n");else ca++;for(i = 1; i <= n; ++i)scanf("%s",map[i]+1);for(i = 1; i <= n; ++i)for(j = 1; j <= m; ++j){if(map[i][j] != '*'){ans[i][j] = 0;for(k = 0; k <8; ++k){x = i + dir[k][0];y = j + dir[k][1];if(check(x,y) && map[x][y] =='*')ans[i][j]++;}}}for(i = 1; i <= n; ++i){for(j = 1; j <= m; ++j){if(map[i][j] == '*')printf("*");else if(ans[i][j] == 0)printf("-");elseprintf("%d",ans[i][j]);}printf("\n");}}return 0;}

原创粉丝点击