2019银联高校极客挑战赛初赛第一场总结
2题,97名,T恤到手~
不愧是银联的比赛,密码的安全性很高,整得我自己都快记不住了。。
话说实名认证做晚了,emmm不知道会不会有影响
题目的话难度适中,思路也比较清晰,就是自己代码写得有点挫,WA了好几发-_-
上题解
码队女朋友的王者之路
简单模拟即可,注意净胜场最大可能在赛季过程中,注意long long
#include<bits/stdc++.h> #define MAX 105 using namespace std; typedef long long ll; string s; int main() { int t,n,m,i,j,k; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&k,&m); scanf(" "); cin>>s; ll c=0,cc=0,ans=0; for(i=0;i<n;i++){ if(s[i]=='1') c++; else{ if(k>0) k--; else c--; } cc=max(cc,c); } if(c<0) printf("%lld\n",max(0ll,cc)); else printf("%lld\n",max(0ll,c*(m-1)+cc)); } return 0; }
自学图论的码队弟弟
先用dfs找到奇数环,然后二分确定环内元素的值,最后跑一边bfs找出环外元素的值。
#include<bits/stdc++.h> #define MAX 100005 using namespace std; typedef long long ll; vector<int> v[MAX],vv,vvv; map<int,map<int,int> > mp; queue<int> q; int a[MAX],b[MAX],bb[MAX]; int f; void dfs(int pre,int x){ if(f==1) return; for(int i=0;i<v[x].size();i++){ int to=v[x][i]; if(to==pre) continue; if(b[to]){ vv.push_back(to); f=1; return; } b[to]=1; vv.push_back(to); dfs(x,to); if(f==1) return; vv.pop_back(); } } int main() { int t,n,x,y,z,i,j; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d%d%d",&x,&y,&z); v[x].push_back(y); v[y].push_back(x); mp[x][y]=z; mp[y][x]=z; } if(n==1){ printf("%d\n",z); return 0; } f=0; b[1]=1; vv.push_back(1); dfs(-1,1); for(i=0;i<vv.size();i++){ if(vv[i]==vv[vv.size()-1]){ for(j=i;j<vv.size();j++){ vvv.push_back(vv[j]); } break; } } // for(i=0;i<vvv.size();i++){ // printf("%d ",vvv[i]); // }printf("\n"); int l=-32768,r=32768,m; while(l<=r){ m=(l+r)/2; int ff=0; a[vvv[0]]=m; for(i=1;i<vvv.size()-1;i++){ a[vvv[i]]=mp[vvv[i-1]][vvv[i]]-a[vvv[i-1]]; if(a[vvv[i]]<-32768&&(i&1)){ ff=1; break; } else if(a[vvv[i]]<-32768&&(i%2==0)){ ff=2; break; } else if(a[vvv[i]]>32768&&(i&1)){ ff=2; break; } else if(a[vvv[i]]>32768&&(i%2==0)){ ff=1; break; } } if(ff==1){ r=m-1; } else if(ff==2){ l=m+1; } else{ int z=mp[vvv[vvv.size()-2]][vvv[vvv.size()-1]]-a[vvv[vvv.size()-2]]; if(z<-32768){ r=m-1; } else if(z>32768){ l=m+1; } else if(a[vvv[0]]==z){ break; } else if(a[vvv[0]]<z){ l=m+1; } else{ r=m-1; } } } for(i=0;i<vvv.size()-1;i++){ q.push(vvv[i]); bb[vvv[i]]=1; } while(q.size()){ int p=q.front(); for(i=0;i<v[p].size();i++){ int to=v[p][i]; if(bb[to]) continue; bb[to]=1; a[to]=mp[p][to]-a[p]; q.push(to); } q.pop(); } for(i=1;i<=n;i++){ printf("%d\n",a[i]); } return 0; } /* 8 1 2 11 2 3 7 2 4 9 4 5 2 4 6 8 5 7 13 6 8 -1 7 8 -2 */
折扇染色(非正解)
猜的结论,只能过样例。。正解貌似要用到状态转移
#include<bits/stdc++.h> #define MAX 500005 #define MOD 1000000007 using namespace std; typedef long long ll; ll a[MAX]; int main() { int t,i,j,k; a[1]=1; for(i=2;i<=500002;i++){ a[i]=a[i-1]*i%MOD; } scanf("%d",&t); while(t--){ ll n,m; scanf("%lld%lld",&n,&m); if(m==4) printf("%lld\n",a[m]*n%MOD); else if(m>4) printf("%lld\n",a[m+1]*(n-1)%MOD); else printf("%lld\n",a[m-1]*(n+1)%MOD); } return 0; }
博文系博主原创,转载请注明出处 o(* ̄▽ ̄*)ブ 更多博文源自https://www.cnblogs.com/yzm10