【套题】东北大学2019新生集训

目录【收录】【未收录】:

  ※1.1 - N个数求和

  ※1.2 - 比较大小

  ※1.3 - A-B

  ※1.4 - 计算指数

  ※1.5 - 计算阶乘和

  ※1.6 - 简单题

  ※1.7 - 跟奥巴马一起画方块

  ※1.8 - 查验身份证

  ※1.9 - 集合相似度

  ※1.10 - 树的遍历

  ※1.11 - 家庭房产

  ※1.12 - 最长对称子串

  ※1.13 - 肿瘤诊断

  ※1.14 - 垃圾箱分布

  ※1.15 - 迎风一刀斩

  ※2.1 - 到底有多二

  ※2.2 - 大笨钟

  ※2.3 - 谁先倒

  ※2.4 - 帅到没朋友

  ※2.5 - 重要的话说三遍

  ※2.6 - 奇偶分家

  ※2.7 - 输出GPLT

  ※2.8 - 后天

  ※2.9 - 抢红包

  ※2.10 - 排座位

  ※2.11 - 玩转二叉树

  ※2.12 - 关于堆的判断

  ※2.13 - 天梯地图

  ※2.14 - 喊山

  ※3.1 - 正整数A+B

  ※3.2 - I Love GPLT

  ※3.3 - 出租

  ※3.4 - 判断素数

  ※3.5 - 是不是太胖了

  ※3.6 - 一帮一

  ※3.7 - 到底是不是太胖了

  ※3.8 - Left-pad

  ※3.9 - 红色警报

  ※3.10 - 列车调度

  ※3.11 - 互评成绩

  ※3.12 - 愿天下有情人都是失散多年的兄妹

  ※3.13 - 是否完全二叉搜索树

  ※3.14 - 直捣黄龙

 

题1.1 - N个数求和

gcd实时化简

最后对答案正负再进行判断

开长整型

 1 #include
 2 using namespace std;
 3 typedef long long ll;
 4 ll gcd(ll a,ll b){
 5     return !b?a:gcd(b,a%b);
 6 }
 7 int main(){
 8     int N;
 9     ll a,b,up=0,down=1,real=0,lcm,d;
10     scanf("%d",&N);
11     while(N--){
12         scanf("%lld/%lld",&a,&b);
13         lcm=down/gcd(down,b)*b;
14         
15         d=lcm/down;
16         up*=d;
17         down=lcm;
18         
19         up+=lcm/b*a;
20         
21         d=gcd(up,down);
22         up/=d;
23         down/=d;
24         
25         d=up/down;
26         up%=down;
27         real+=d;
28     }
29     if(down<0)
30         up=-up,down=-down;
31     if(real){
32         if(up<0){
33             if(real>0){
34                 real--;
35                 up+=down;
36             }
37             else
38                 up=-up;
39         }
40         else if(up>0){
41             if(real<0){
42                 real++;
43                 if(!real)
44                     up=-up;
45                 up+=down;
46             }
47         }
48     }
49     if(real==0&&up==0)
50         puts("0");
51     else if(real!=0&&up==0)
52         printf("%lld\n",real);
53     else if(real!=0&&up!=0)
54         printf("%lld %lld/%lld\n",real,up,down);
55     else
56         printf("%lld/%lld\n",up,down);
57     
58     return 0;
59 }

 

题1.2 - 比较大小

 1 #include
 2 using namespace std;
 3 int main(){
 4     int a[3];
 5     cin>>a[0]>>a[1]>>a[2];
 6     sort(a,a+3);
 7     cout<0]<<"->"<1]<<"->"<2]<<'\n';
 8     
 9     return 0;
10 }

 

题1.3 - A-B

 1 #include
 2 using namespace std;
 3 char a[10050];
 4 int main(){
 5     bool b[128];
 6     fill(b,b+128,true);
 7     cin.getline(a,10050);
 8     int len=strlen(a),i;
 9     char c;
10     while((c=getchar())!='\n'&&c!=EOF)
11         b[c]=false;
12     for(i=0;i)
13         if(b[a[i]])
14             putchar(a[i]);
15     
16     return 0;
17 }

 

题1.4 - 计算指数

 1 #include
 2 using namespace std;
 3 int main(){
 4     int n,ans=1;
 5     cin>>n;
 6     cout<<"2^"<" = ";
 7     while(n--)
 8         ans*=2;
 9     cout<<ans;
10     
11     return 0;
12 }

 

题1.5 - 计算阶乘和

 1 #include
 2 using namespace std;
 3 int main(){
 4     int n,s=0,f=1,i;
 5     cin>>n;
 6     for(i=1;i<=n;i++)
 7         f*=i,s+=f;
 8     cout<<s;
 9     
10     return 0;
11 }

 

题1.6 - 简单题

1 #include
2 using namespace std;
3 int main(){
4     cout<<"This is a simple problem.";
5     return 0;
6 }

 

题1.7 - 跟奥巴马一起画方块

四舍五入

 1 #include
 2 using namespace std;
 3 int main(){
 4     int n,i,j;
 5     string s;
 6     cin>>n>>s;
 7     for(i=0;i<(n+1)/2;i++){
 8         for(j=0;j)
 9             putchar(s[0]);
10         putchar('\n');
11     }
12     
13     return 0;
14 }

 

题1.8 - 查验身份证

 1 #include
 2 using namespace std;
 3 vector<string> v;
 4 int ave[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
 5 char val[11]={'1','0','X','9','8','7','6','5','4','3','2'};
 6 void solve(){
 7     string s;
 8     cin>>s;
 9     int flag=0,i;
10     for(i=0;i<17;i++)
11         if(s[i]>='0'&&s[i]<='9')
12             flag=(flag+ave[i]*(s[i]-'0'))%11;
13         else{
14             v.push_back(s);
15             return;
16         }
17     if(s[17]!=val[flag])
18         v.push_back(s);
19 }
20 int main(){
21     ios::sync_with_stdio(0);
22     cin.tie(0);cout.tie(0);
23     int i,N;
24     cin>>N;
25     while(N--)
26         solve();
27     if(v.empty())
28         cout<<"All passed\n";
29     else
30         for(i=0;i)
31             cout<'\n';
32     
33     return 0;
34 }

 

题1.9 - 集合相似度

set去重,迭代器遍历

题意为取交集和并集的元素个数

 1 #include
 2 using namespace std;
 3 set<int> s[55];
 4 set<int>::iterator it;
 5 int main(){
 6     ios::sync_with_stdio(0);
 7     cin.tie(0);cout.tie(0);
 8     int N,M,K,i,j,d,a,b;
 9     scanf("%d",&N);
10     for(i=1;i<=N;i++){
11         scanf("%d",&M);
12         for(j=0;j){
13             scanf("%d",&d);
14             s[i].insert(d);
15         }
16     }
17     scanf("%d",&K);
18     while(K--){
19         scanf("%d%d",&a,&b);
20         if(s[a].size()>s[b].size())
21             swap(a,b);
22         int same=0,all=s[b].size();
23         for(it=s[a].begin();it!=s[a].end();it++){
24             if(s[b].find(*it)==s[b].end())
25                 all++;
26             else
27                 same++;
28         }
29         printf("%.2f%c\n",100.0*same/all,'%');
30     }
31     
32     return 0;
33 }

 

题1.10 - 树的遍历

建树后再bfs

 1 #include
 2 using namespace std;
 3 struct node{
 4     int id,l,r;
 5 }tree[35];
 6 int LRD[35],LDR[35],cnt=0;
 7 int buildTree(int ml,int mr,int bl,int br){
 8     if(ml>mr)
 9         return 0;
10     node data;
11     data.id=LRD[br];
12     int p;
13     for(p=ml;p<=mr;p++)
14         if(LDR[p]==LRD[br])
15             break;
16     data.l=buildTree(ml,p-1,bl,bl+p-ml-1);
17     data.r=buildTree(p+1,mr,br+p-mr,br-1);
18     tree[++cnt]=data;
19     return cnt;
20 }
21 int main(){
22     ios::sync_with_stdio(0);
23     cin.tie(0);cout.tie(0);
24     int N,i;
25     cin>>N;
26     for(i=1;i<=N;i++)
27         cin>>LRD[i];
28     for(i=1;i<=N;i++)
29         cin>>LDR[i];
30     int root=buildTree(1,N,1,N);
31     vector<int> ans;
32     queue<int> q;
33     q.push(root);
34     while(!q.empty()){
35         int cur=q.front();
36         q.pop();
37         ans.push_back(tree[cur].id);
38         if(tree[cur].l)
39             q.push(tree[cur].l);
40         if(tree[cur].r)
41             q.push(tree[cur].r);
42     }
43     cout<0];
44     for(i=1;i)
45         cout<<' '<<ans[i];
46     
47     return 0;
48 }

 

题1.11 - 家庭房产

 1 #include
 2 #include
 3 using namespace std;
 4 struct node{
 5     int cnt,sum;
 6     double squ;
 7 }peo[10010];
 8 struct node2{
 9     int id,cnt,sum;
10     double squ;
11     friend bool operator < (const node2& a,const node2& b){
12         if(a.squ/a.sum!=b.squ/b.sum)
13             return a.squ/a.sum>b.squ/b.sum;
14         return a.id<b.id;
15     }
16 }ans[10010];
17 int gp[10010];
18 bool vis[10010];
19 int findp(int p){
20     return p==gp[p]?p:(gp[p]=findp(gp[p]));
21 }
22 void merge(int a,int b){
23     int gpa=findp(a),gpb=findp(b);
24     if(gpa<gpb)
25         gp[gpb]=gpa;
26     else
27         gp[gpa]=gpb;
28 }
29 void move(int from,int to){
30     peo[to].cnt+=peo[from].cnt;
31     peo[to].squ+=peo[from].squ;
32     peo[to].sum+=peo[from].sum;
33 }
34 int main(){
35     int N,i,cur,id,k,cnt;
36     for(i=0;i<10000;i++){
37         gp[i]=i;
38         peo[i].sum=1;
39     }
40     scanf("%d",&N);
41     while(N--){
42         scanf("%d",&cur);
43         vis[cur]=true;
44         for(i=0;i<2;i++){
45             scanf("%d",&id);
46             if(id==-1)
47                 continue;
48             vis[id]=true;
49             merge(cur,id);
50         }
51         scanf("%d",&k);
52         while(k--){
53             scanf("%d",&id);
54             if(id==-1)
55                 continue;
56             vis[id]=true;
57             merge(cur,id);
58         }
59         scanf("%d%lf",&peo[cur].cnt,&peo[cur].squ);
60     }
61     for(i=9999;i>=0;i--)
62         if(i!=gp[i])
63             move(i,gp[i]);
64     cnt=0;
65     for(i=0;i<10000;i++)
66         if(vis[i]&&i==gp[i]){
67             ans[cnt].id=i;
68             ans[cnt].squ=peo[i].squ;
69             ans[cnt].cnt=peo[i].cnt;
70             ans[cnt].sum=peo[i].sum;
71             cnt++;
72         }
73     sort(ans,ans+cnt);
74     printf("%d\n",cnt);
75     for(i=0;i)
76         printf("%04d %d %.3f %.3f\n",ans[i].id,ans[i].sum,1.0*ans[i].cnt/ans[i].sum,ans[i].squ/ans[i].sum);
77     
78     return 0;
79 }

 

题1.12 - 最长对称子串

枚举中间位置左右搜索

 1 #include
 2 using namespace std;
 3 char s[1010];
 4 int len;
 5 int g(int p){
 6     int l=p,r=p;
 7     while(l>=0&&rs[r])
 8         l--,r++;
 9     return r-l-1;
10 }
11 int g2(int p){
12     int l=p,r=p+1;
13     while(l>=0&&rs[r])
14         l--,r++;
15     return r-l-1;
16 }
17 int main(){
18     cin.getline(s,1010);
19     int i,ans=1;
20     len=strlen(s);
21     for(i=1;i1;i++)
22         ans=max(ans,max(g(i),g2(i)));
23     cout<'\n';
24     return 0;
25 }

 

题1.13 - 肿瘤诊断

三维bfs

 1 #include
 2 using namespace std;
 3 typedef long long ll;
 4 struct d3p{
 5     int x,y,z;
 6     d3p(int a,int b,int c){
 7         x=a;
 8         y=b;
 9         z=c;
10     }
11 };
12 int M,N,L,T,px[65][1300][130],ansd;
13 int dx[6]={-1,0,1,0,0,0},dy[6]={0,0,0,0,1,-1},dz[6]={0,-1,0,1,0,0};
14 queue q;
15 inline bool prim(int x,int y,int z){
16     return x>0&&y>0&&z>0&&x<=L&&y<=M&&z<=N;
17 }
18 void bfs(int x,int y,int z){
19     q.push(d3p(x,y,z));
20     px[x][y][z]=0;
21     ansd=1;
22     int i,xx,yy,zz;
23     while(!q.empty()){
24         d3p d=q.front();
25         q.pop();
26         for(i=0;i<6;i++){
27             xx=d.x+dx[i];
28             yy=d.y+dy[i];
29             zz=d.z+dz[i];
30             if(prim(xx,yy,zz)&&px[xx][yy][zz]){
31                 ansd++;
32                 px[xx][yy][zz]=0;
33                 q.push(d3p(xx,yy,zz));
34             }
35         }
36     }
37 }
38 int main(){
39     ios::sync_with_stdio(0);
40     cin.tie(0);cout.tie(0);
41     int i,j,k,d,ans=0;
42     cin>>M>>N>>L>>T;
43     for(i=1;i<=L;i++)
44         for(j=1;j<=M;j++)
45             for(k=1;k<=N;k++)
46                 cin>>px[i][j][k];
47     for(i=1;i<=L;i++)
48         for(j=1;j<=M;j++)
49             for(k=1;k<=N;k++)
50                 if(px[i][j][k]){
51                     bfs(i,j,k);
52                     if(ansd>=T)
53                         ans+=ansd;
54                 }
55     cout<'\n';
56     
57     return 0;
58 }

 

题1.14 - 垃圾箱分布

最短路后对答案进行处理

 1 #include
 2 using namespace std;
 3 typedef pair<int,int> P;
 4 struct node{
 5     int id,min;
 6     double ave;
 7     bool operator < (const node& a) const{
 8         if(min!=a.min)
 9             return min>a.min;
10         if(ave!=a.ave)
11             return ave<a.ave;
12         return id<a.id;
13     }
14 };
15 int N,M,K,Ds,dis[1050];
16 vector

v[1050]; 17 void sp(int st){ 18 memset(dis,0x3f,sizeof dis); 19 queue<int> q; 20 q.push(st); 21 dis[st]=0; 22 int d,cnt,i,ddis; 23 while(!q.empty()){ 24 d=q.front(); 25 q.pop(); 26 cnt=v[d].size(); 27 for(i=0;i){ 28 ddis=dis[d]+v[d][i].second; 29 if(dis[v[d][i].first]>ddis){ 30 dis[v[d][i].first]=ddis; 31 q.push(v[d][i].first); 32 } 33 } 34 } 35 } 36 int main(){ 37 ios::sync_with_stdio(0); 38 cin.tie(0);cout.tie(0); 39 cin>>N>>M>>K>>Ds; 40 string s1,s2; 41 int i,j,a,b,d,mindis; 42 long long sumdis; 43 vector ans; 44 while(K--){ 45 cin>>s1>>s2>>d; 46 if(s1[0]=='G'){ 47 s1=s1.substr(1); 48 a=stoi(s1)+N; 49 } 50 else 51 a=stoi(s1); 52 if(s2[0]=='G'){ 53 s2=s2.substr(1); 54 b=stoi(s2)+N; 55 } 56 else 57 b=stoi(s2); 58 v[a].push_back(P(b,d)); 59 v[b].push_back(P(a,d)); 60 } 61 for(i=N+1;i<=N+M;i++){ 62 sp(i); 63 mindis=0x7fffffff; 64 sumdis=0; 65 for(j=1;j<=N;j++){ 66 if(dis[j]>Ds){ 67 mindis=-1; 68 break; 69 } 70 mindis=min(mindis,dis[j]); 71 sumdis+=dis[j]; 72 } 73 if(mindis!=-1){ 74 node nd; 75 nd.id=i-N; 76 nd.min=mindis; 77 nd.ave=1.0*sumdis/N; 78 ans.push_back(nd); 79 } 80 } 81 if(ans.size()){ 82 sort(ans.begin(),ans.end()); 83 printf("G%d\n%d.0 %.1f",ans[0].id,ans[0].min,ans[0].ave); 84 } 85 else 86 cout<<"No Solution"; 87 88 return 0; 89 }

 

题2.1 - 到底有多二

 1 #include
 2 using namespace std;
 3 int main(){
 4     string s;
 5     cin>>s;
 6     int i,len=s.length(),num=0;
 7     double deep=100.0;
 8     if(s[0]=='-'){
 9         deep=150.0;
10         s=s.substr(1);
11         len--;
12     }
13     for(i=0;i)
14         if(s[i]=='2')
15             num++;
16     if((s[len-1]-'0')%2==0)
17         deep*=2;
18     cout<<fixed<2)<"%\n";
19     
20     return 0;
21 }

 

题2.2 - 大笨钟

 1 #include
 2 using namespace std;
 3 int main(){
 4     int h,m,i;
 5     scanf("%d:%d",&h,&m);
 6     if(h>=0&&h<12||h==12&&m==0)
 7         printf("Only %02d:%02d.  Too early to Dang.",h,m);
 8     else{
 9         if(m)
10             h++;
11         h-=12;
12         for(i=0;i)
13             printf("Dang");
14     }
15     
16     return 0;
17 }

 

题2.3 - 谁先倒

 1 #include
 2 using namespace std;
 3 int main(){
 4     ios::sync_with_stdio(0);
 5     cin.tie(0);cout.tie(0);
 6     int A,B,N,AA=0,BB=0,a,b,c,d,e;
 7     cin>>A>>B>>N;
 8     while(N--){
 9         cin>>a>>b>>c>>d;
10         e=a+c;
11         if((b==e)==(d==e))
12             continue;
13         if(b==e)
14             AA++;
15         else
16             BB++;
17         if(AA>A){
18             cout<<"A\n"<'\n';
19             break;
20         }
21         else if(BB>B){
22             cout<<"B\n"<'\n';
23             break;
24         }
25     }
26     
27     return 0;
28 }

 

题2.4 - 帅到没朋友

没朋友的只可能没出现,或者单独成组

所以取每个人最大朋友圈的人数,取那些人数为0和1的即可

 1 #include
 2 using namespace std;
 3 int m[100010];
 4 set<int> s;
 5 vector<int> ans;
 6 int main(){
 7     ios::sync_with_stdio(0);
 8     cin.tie(0);cout.tie(0);
 9     int N,M,K,i,d;
10     cin>>N;
11     while(N--){
12         cin>>K;
13         for(i=0;i){
14             cin>>d;
15             m[d]=max(m[d],K);
16         }
17     }
18     cin>>M;
19     while(M--){
20         cin>>d;
21         if(s.find(d)==s.end()){
22             s.insert(d);
23             if(m[d]<=1)
24                 ans.push_back(d);
25         }
26     }
27     if(ans.size())
28         for(i=0;i)
29             printf("%05d%c",ans[i],((i==ans.size()-1)?'\n':' '));
30     else
31         puts("No one is handsome");
32     
33     return 0;
34 }

 

题2.5 - 重要的话说三遍

1 #include
2 using namespace std;
3 int main(){
4     string s="I'm gonna WIN!";
5     for(int i=0;i<3;i++)
6         cout<'\n';
7     
8     return 0;
9 }

 

题2.6 - 奇偶分家

 1 #include
 2 using namespace std;
 3 int main(){
 4     int N,a=0,b=0,d;
 5     cin>>N;
 6     while(N--){
 7         cin>>d;
 8         if(d%2)
 9             a++;
10         else
11             b++;
12     }
13     cout<' '<<b;
14     
15     return 0;
16 }

 

题2.7 - 输出GPLT

 1 #include
 2 using namespace std;
 3 int main(){
 4     string s;
 5     cin>>s;
 6     int len=s.length(),i,d=0,r[4]={0};
 7     for(i=0;i)
 8         if(s[i]=='g'||s[i]=='G')
 9             r[0]++,d++;
10         else if(s[i]=='p'||s[i]=='P')
11             r[1]++,d++;
12         else if(s[i]=='l'||s[i]=='L')
13             r[2]++,d++;
14         else if(s[i]=='t'||s[i]=='T')
15             r[3]++,d++;
16     for(i=0;d;i=(i+1)%4)
17         if(r[i]){
18             r[i]--;
19             d--;
20             if(i==0)
21                 putchar('G');
22             else if(i==1)
23                 putchar('P');
24             else if(i==2)
25                 putchar('L');
26             else
27                 putchar('T');
28         }
29     
30     return 0;
31 }

 

题2.8 - 后天

1 #include
2 using namespace std;
3 int main(){
4     int d;
5     cin>>d;
6     cout<<(d+1)%7+1;
7     
8     return 0;
9 }

 

题2.9 - 抢红包

 1 #include
 2 using namespace std;
 3 struct node{
 4     int id,cnt,sum;
 5 }ar[10010];
 6 bool cmp(node a,node b){
 7     if(a.sum!=b.sum)
 8         return a.sum>b.sum;
 9     if(a.cnt!=b.cnt)
10         return a.cnt>b.cnt;
11     return a.id<b.id;
12 }
13 int main(){
14     int N,K,a,b,i,j;
15     scanf("%d",&N);
16     for(i=1;i<=N;i++){
17         ar[i].id=i;
18         scanf("%d",&K);
19         while(K--){
20             scanf("%d%d",&a,&b);
21             ar[a].cnt++;
22             ar[a].sum+=b;
23             ar[i].sum-=b;
24         }
25     }
26     sort(ar+1,ar+1+N,cmp);
27     for(i=1;i<=N;i++)
28         printf("%d %.2f\n",ar[i].id,0.01*ar[i].sum);
29     
30     return 0;
31 }

 

题2.10 - 排座位

朋友使用并查集,敌人直接判断

 1 #include
 2 using namespace std;
 3 int gp[110];
 4 bool fight[110][110];
 5 int findp(int p){
 6     return p==gp[p]?p:(gp[p]=findp(gp[p]));
 7 }
 8 void merge(int a,int b){
 9     gp[findp(a)]=findp(b);
10 }
11 int main(){
12     int N,M,K,i,a,b,d;
13     scanf("%d%d%d",&N,&M,&K);
14     for(i=1;i<=N;i++)
15         gp[i]=i;
16     while(M--){
17         cin>>a>>b>>d;
18         if(d==1)
19             merge(a,b);
20         else
21             fight[a][b]=fight[b][a]=true;
22     }
23     while(K--){
24         cin>>a>>b;
25         bool f=fight[a][b];
26         a=findp(a);
27         b=findp(b);
28         if(a==b&&f)
29             puts("OK but...");
30         else if(a==b&&!f)
31             puts("No problem");
32         else if(a!=b&&f)
33             puts("No way");
34         else
35             puts("OK");
36     }
37     
38     return 0;
39 }

 

题2.11 - 玩转二叉树

题类似于1.10,翻转可以看成先查找右儿子再查找左儿子

 1 #include
 2 using namespace std;
 3 struct node{
 4     int id,l,r;
 5 }tree[35];
 6 int DLR[35],LDR[35],cnt=0;
 7 int buildTree(int ml,int mr,int al,int ar){
 8     if(ml>mr)
 9         return 0;
10     node data;
11     data.id=DLR[al];
12     int p;
13     for(p=ml;p<=mr;p++)
14         if(LDR[p]==DLR[al])
15             break;
16     data.l=buildTree(ml,p-1,al+1,al+p-ml);
17     data.r=buildTree(p+1,mr,ar+p-mr+1,ar);
18     tree[++cnt]=data;
19     return cnt;
20 }
21 int main(){
22     ios::sync_with_stdio(0);
23     cin.tie(0);cout.tie(0);
24     int N,i;
25     cin>>N;
26     for(i=1;i<=N;i++)
27         cin>>LDR[i];
28     for(i=1;i<=N;i++)
29         cin>>DLR[i];
30     int root=buildTree(1,N,1,N);
31     vector<int> ans;
32     queue<int> q;
33     q.push(root);
34     while(!q.empty()){
35         int cur=q.front();
36         q.pop();
37         ans.push_back(tree[cur].id);
38         if(tree[cur].r)
39             q.push(tree[cur].r);
40         if(tree[cur].l)
41             q.push(tree[cur].l);
42     }
43     cout<0];
44     for(i=1;i)
45         cout<<' '<<ans[i];
46     
47     return 0;
48 }

 

题2.13 - 天梯地图

最短路+路径记录

用string和vector动态记录一条路径和走这条路时的最短路长度,最后再处理

  1 #include
  2 using namespace std;
  3 typedef pair<int,int> P;
  4 typedef pair<int,string> PT;
  5 int ST,ED,dis[505],tim[505],tmpdis[505][505];
  6 vector

vdis[505],vtim[505]; 7 string sdis[505],stim[505],finaltimstr,finaldisstr; 8 vector vsdis,vstim; 9 queue<int> q; 10 int getDistance(string in){ 11 int i,len=in.size(),tmp=0,res=0,from,to; 12 bool flag=false,flag2=false; 13 for(i=0;i){ 14 if(in[i]>='0'&&in[i]<='9'){ 15 flag=true; 16 tmp=tmp*10+in[i]-'0'; 17 } 18 else{ 19 if(flag){ 20 flag=false; 21 if(!flag2){ 22 flag2=true; 23 to=tmp; 24 } 25 else{ 26 from=to; 27 to=tmp; 28 res+=tmpdis[from][to]; 29 } 30 tmp=0; 31 } 32 } 33 } 34 return res; 35 } 36 int getNodeCnt(string in){ 37 int res=1,i,len=in.size(); 38 for(i=0;i) 39 if(in[i]=='=') 40 res++; 41 return res; 42 } 43 void dealAns(){ 44 int mn,cnt,tmp,i,cur; 45 cnt=vstim.size(); 46 mn=0x3f3f3f3f; 47 for(i=0;i){ 48 if(vstim[i].first!=tim[ED]) 49 continue; 50 tmp=getDistance(vstim[i].second); 51 if(tmp<mn){ 52 mn=tmp; 53 cur=i; 54 } 55 } 56 finaltimstr=vstim[cur].second; 57 cnt=vsdis.size(); 58 mn=999; 59 for(i=0;i){ 60 if(vsdis[i].first!=dis[ED]) 61 continue; 62 tmp=getNodeCnt(vsdis[i].second); 63 if(tmp<mn){ 64 mn=tmp; 65 cur=i; 66 } 67 } 68 finaldisstr=vsdis[cur].second; 69 } 70 void deal(){ 71 memset(dis,0x3f,sizeof dis); 72 memset(tim,0x3f,sizeof tim); 73 dis[ST]=tim[ST]=0; 74 sdis[ST]=stim[ST]=to_string(ST); 75 q.push(ST); 76 while(!q.empty()){ 77 int cur=q.front(),cnt,tmp,p,i; 78 q.pop(); 79 cnt=vdis[cur].size(); 80 for(i=0;i){ 81 tmp=dis[cur]+vdis[cur][i].second; 82 p=vdis[cur][i].first; 83 if(dis[p]>=tmp){//必须要等于号 84 dis[p]=tmp; 85 sdis[p]=sdis[cur]+" => "+to_string(p); 86 if(p==ED) 87 vsdis.push_back(PT(dis[p],sdis[p])); 88 else 89 q.push(p); 90 } 91 } 92 } 93 q.push(ST); 94 while(!q.empty()){ 95 int cur=q.front(),cnt,tmp,p,i; 96 q.pop(); 97 cnt=vtim[cur].size(); 98 for(i=0;i){ 99 tmp=tim[cur]+vtim[cur][i].second; 100 p=vtim[cur][i].first; 101 if(tim[p]>=tmp){ 102 tim[p]=tmp; 103 stim[p]=stim[cur]+" => "+to_string(p); 104 if(p==ED) 105 vstim.push_back(PT(tim[p],stim[p])); 106 else 107 q.push(p); 108 } 109 } 110 } 111 } 112 int main(){ 113 ios::sync_with_stdio(0); 114 cin.tie(0);cout.tie(0); 115 int N,M,V1,V2,OW,LL,TT; 116 memset(tmpdis,0x3f,sizeof tmpdis); 117 cin>>N>>M; 118 while(M--){ 119 cin>>V1>>V2>>OW>>LL>>TT; 120 vdis[V1].push_back(P(V2,LL)); 121 tmpdis[V1][V2]=min(tmpdis[V1][V2],LL); 122 vtim[V1].push_back(P(V2,TT)); 123 if(!OW){ 124 vdis[V2].push_back(P(V1,LL)); 125 tmpdis[V2][V1]=min(tmpdis[V2][V1],LL); 126 vtim[V2].push_back(P(V1,TT)); 127 } 128 } 129 cin>>ST>>ED; 130 deal(); 131 dealAns(); 132 if(finaldisstr!=finaltimstr) 133 cout<<"Time = "<": "<"\nDistance = "<": "<<finaldisstr; 134 else 135 cout<<"Time = "<"; Distance = "<": "<<finaldisstr; 136 137 return 0; 138 }

 

题2.14 - 喊山

bfs

 1 #include
 2 using namespace std;
 3 vector<int> v[10010];
 4 queue<int> q;
 5 int n,dis[10010];
 6 int bfs(int st){
 7     int res=0,cur,cnt,i,d;
 8     memset(dis,0x3f,sizeof dis);
 9     dis[st]=0;
10     q.push(st);
11     while(!q.empty()){
12         cur=q.front();
13         q.pop();
14         cnt=v[cur].size();
15         for(i=0;i)
16             if(dis[cur]+1<dis[v[cur][i]]){
17                 dis[v[cur][i]]=dis[cur]+1;
18                 q.push(v[cur][i]);
19                 res=max(res,dis[v[cur][i]]);
20             }
21     }
22     if(!res)
23         return 0;
24     for(i=1;i<=n;i++)
25         if(dis[i]==res)
26             return i;
27 }
28 int main(){
29     ios::sync_with_stdio(0);
30     cin.tie(0);cout.tie(0);
31     int m,k,i,a,b;
32     cin>>n>>m>>k;
33     while(m--){
34         cin>>a>>b;
35         v[a].push_back(b);
36         v[b].push_back(a);
37     }
38     while(k--){
39         cin>>a;
40         cout<'\n';
41     }
42     
43     return 0;
44 }

 

题3.1 - 正整数A+B

 1 #include
 2 using namespace std;
 3 char s[10000];
 4 int main(){
 5     int i,len,a=0,b=0;
 6     cin.getline(s,10000);
 7     len=strlen(s);
 8     bool flag=false,p1=true,p2=true;
 9     for(i=0;i){
10         if(s[i]==' '){
11             flag=true;
12             continue;
13         }
14         if(!flag&&p1){
15             if(s[i]>='0'&&s[i]<='9'){
16                 a=a*10+s[i]-'0';
17                 if(a>1000)
18                     p1=false;
19             }
20             else
21                 p1=false;
22         }
23         else if(flag&&p2){
24             if(s[i]>='0'&&s[i]<='9'){
25                 b=b*10+s[i]-'0';
26                 if(b>1000)
27                     p2=false;
28             }
29             else
30                 p2=false;
31         }
32     }
33     if(!a)
34         p1=false;
35     if(!b)
36         p2=false;
37     if(p1){
38         if(p2)
39             cout<" + "<" = "<b;
40         else
41             cout<" + ? = ?";
42     }
43     else{
44         if(p2)
45             cout<<"? + "<" = ?";
46         else
47             cout<<"? + ? = ?";
48     }
49     
50     return 0;
51 }

 

题3.2 - I Love GPLT

1 #include
2 using namespace std;
3 int main(){
4     string s="I Love GPLT";
5     for(int i=0;i<11;i++)
6         cout<'\n';
7     
8     return 0;
9 }

 

题3.3 - 出租

 1 #include
 2 using namespace std;
 3 int main(){
 4     ios::sync_with_stdio(0);
 5     cin.tie(0);cout.tie(0);
 6     int i,cnt=0,to[10];
 7     bool vis[10];
 8     string s;
 9     cin>>s;
10     fill(vis,vis+10,false);
11     for(i=0;i<11;i++)
12         vis[s[i]-'0']=true;
13     cout<<"int[] arr = new int[]{";
14     for(i=9;i>=0;i--)
15         if(vis[i]){
16             to[i]=cnt;
17             if(!cnt)
18                 cout<<i;
19             else
20                 cout<<','<<i;
21             cnt++;
22         }
23     cout<<"};\nint[] index = new int[]{"<0]-'0'];
24     for(i=1;i<11;i++)
25         cout<<','<'0'];
26     cout<<"};";
27     
28     return 0;
29 }

 

题3.4 - 判断素数

 1 #include
 2 using namespace std;
 3 void solve(){
 4     int n,d,i;
 5     cin>>n;
 6     if(n==1){
 7         cout<<"No\n";
 8         return;
 9     }
10     d=sqrt(n);
11     for(i=2;i<=d;i++)
12         if(n%i==0){
13             cout<<"No\n";
14             return;
15         }
16     cout<<"Yes\n";
17 }
18 int main(){
19     ios::sync_with_stdio(0);
20     cin.tie(0);cout.tie(0);
21     int N;cin>>N;while(N--)
22         solve();
23     
24     return 0;
25 }

 

题3.5 - 是不是太胖了

1 #include
2 using namespace std;
3 int main(){
4     double H;
5     scanf("%lf",&H);
6     printf("%.1f",(H-100)*1.8);
7     
8     return 0;
9 }

 

题3.6 - 一帮一

 1 #include
 2 using namespace std;
 3 typedef pair<int,string> P;
 4 P r[55];
 5 bool vis[55];
 6 int main(){
 7     ios::sync_with_stdio(0);
 8     cin.tie(0);cout.tie(0);
 9     int N,d,i,j;
10     string name;
11     cin>>N;
12     for(i=1;i<=N;i++){
13         cin>>d>>name;
14         r[i]=P(d,name);
15     }
16     for(d=0;d2){
17         for(i=1;i<=N;i++)
18             if(!vis[i])
19                 break;
20         for(j=N;j;j--)
21             if(!vis[j]&&r[i].first!=r[j].first)
22                 break;
23         vis[i]=vis[j]=true;
24         cout<' '<'\n';
25     }
26     
27     return 0;
28 }

 

题3.7 - 到底是不是太胖了

 1 #include
 2 using namespace std;
 3 int main(){
 4     ios::sync_with_stdio(0);
 5     cin.tie(0);cout.tie(0);
 6     int N;
 7     double H,W,dW;
 8     cin>>N;
 9     while(N--){
10         cin>>H>>W;
11         dW=(H-100)*1.8;
12         if(fabs(W-dW)<0.1*dW)
13             cout<<"You are wan mei!\n";
14         else if(W-dW>0)
15             cout<<"You are tai pang le!\n";
16         else
17             cout<<"You are tai shou le!\n";
18     }
19     
20     return 0;
21 }

 

题3.8 - Left-pad

 1 #include
 2 using namespace std;
 3 string ans,s;
 4 int main(){
 5     char c,d;
 6     int N=0,i,len;
 7     while((c=getchar())!=' ')
 8         N=N*10+c-'0';
 9     d=getchar();
10     getchar();
11     while((c=getchar())!='\n')
12         s+=c;
13     len=s.size();
14     for(i=len-1;i>=0&&N;i--,N--)
15         ans=s[i]+ans;
16     while(N--)
17         ans=d+ans;
18     cout<<ans;
19     
20     return 0;
21 }

 

题3.9 - 红色警报

考察并查集

输入时开始建图,保存所有路径,然后开exist数组来表示哪些城市失去了,哪些城市还在,初始化为true,即都还在

第一次建图完毕后,寻找这个图中的连通块数量储存在cnt中(即并查集根节点等于自己的数量)

其后每一次失去一个城市,就把exist标记为false,初始化重新建图

重新建图时忽略已经失去城市的那些边,其他的边把两边的城市继续并查集合并

然后重新寻找连通块数量储存在cntd中

这里把已经失去的城市也当作一个块

因为只有在改变了其他城市之间的连通性时才会发出红色警报

如果国家格局没有被改变,说明此时连通块数量等于上一次连通块数量,即cntd==cnt

  或者如果原本一个连通块中只存在两个城市,这一次失去了二者其中之一,那么此时连通块数量会增加1,但是其他城市连通性并没有被改变,所以此时cntd==cnt+1

  再或者如果只有一个城市处在一个连通块中,这一次这个城市失去了,也不改变其他城市连通性,此时对于算法而言失去与不失去连通块数量都是一样,即cntd==cnt

综上,只有当前连通块数量等于前一次连通块数量或者等于前一次+1时,正常输出,否则红色警报

(注意正常输出后面时一个点红色警报后面是感叹号!!!!!)

 1 #include
 2 using namespace std;
 3 vector<int> v[510];
 4 int gp[510];
 5 bool exist[510];
 6 int findp(int p){
 7     return p==gp[p]?p:(gp[p]=findp(gp[p]));
 8 }
 9 void merge(int a,int b){
10     gp[findp(a)]=findp(b);
11 }
12 int main(){
13     ios::sync_with_stdio(0);
14     cin.tie(0);cout.tie(0);
15     int N,M,K,i,j,k,a,b,id,len,cnt,cntd;
16     cin>>N>>M;
17     memset(exist,true,sizeof exist);
18     for(i=0;i)
19         gp[i]=i;
20     for(i=0;i){
21         cin>>a>>b;
22         v[a].push_back(b);
23         merge(a,b);
24     }
25     for(cnt=i=0;i)
26         if(gp[i]==i)
27             cnt++;
28     cin>>K;
29     for(k=1;k<=K;k++){
30         cin>>id;
31         exist[id]=false;
32         for(i=0;i)
33             gp[i]=i;
34         for(i=0;i)
35             if(exist[i]){
36                 len=v[i].size();
37                 for(j=0;j)
38                     if(exist[v[i][j]])
39                         merge(i,v[i][j]);
40             }
41         for(cntd=i=0;i)
42             if(gp[i]==i)
43                 cntd++;
44         if(cntd==cnt||cntd==cnt+1)
45             cout<<"City "<" is lost.\n";
46         else
47             cout<<"Red Alert: City "<" is lost!\n";
48         cnt=cntd;
49         if(N==k)
50             cout<<"Game Over.\n";
51     }
52     
53     return 0;
54 }

 

题3.10 - 列车调度

因为输出是要按照从大到小输出,所以每条轨道上的车从前往后也都需要按照从大到小排序

我们每次贪心可以得知,为了能让后面加入的车能有更好的放置条件,所以当前车需要放在大于它的id的最小的id的那辆车后面

使用ar数组记录每条轨道最后一辆车的id,cnt记录当前有多少条轨道

又因为如果要加入的车的id大于所有的轨道最后一辆车的id时

就需要多开一条轨道放车了

可以发现轨道从1到cnt,最后一辆车的id是递增的

所以判断是否大于所有轨道最后一辆车id时,实际上只需要对此时的cnt指向的轨道最后一辆车对比就行

如果比这辆车的id小,说明前面有可以放这辆车的轨道

可以二分查找大于当前车id的最小id车所在轨道p(代码直接使用了upper_bound)

然后更新ar[p]=id即可

 1 #include
 2 using namespace std;
 3 const int maxn=100050;
 4 int ar[maxn];
 5 int main(){
 6     ios::sync_with_stdio(0);
 7     cin.tie(0);cout.tie(0);
 8     int N,i,id,cnt=0,p;
 9     cin>>N;
10     fill(ar,ar+maxn,maxn);
11     ar[0]=0;
12     for(i=0;i){
13         cin>>id;
14         if(id>ar[cnt])
15             ar[++cnt]=id;
16         else{
17             p=upper_bound(ar+1,ar+cnt+1,id)-ar;
18             ar[p]=id;
19         }
20     }
21     cout<'\n';
22     
23     return 0;
24 }

 

题3.11 - 互评成绩

 1 #include
 2 using namespace std;
 3 vector<double> ans;
 4 int main(){
 5     int N,K,M,i,j,sum,d,mn,mx;
 6     scanf("%d%d%d",&N,&K,&M);
 7     for(i=0;i){
 8         sum=0;
 9         mn=100;
10         mx=0;
11         for(j=0;j){
12             scanf("%d",&d);
13             sum+=d;
14             mn=min(mn,d);
15             mx=max(mx,d);
16         }
17         sum-=mn+mx;
18         ans.push_back(1.0*sum/(K-2));
19     }
20     sort(ans.begin(),ans.end());
21     printf("%.3f",ans[N-M]);
22     for(i=N-M+1;i)
23         printf(" %.3f",ans[i]);
24     
25     return 0;
26 }

 

 

待补

你可能感兴趣的:(【套题】东北大学2019新生集训)