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;
}
折扇染色(非正解)
posted @ 2019-07-20 17:24  yzm10  阅读(642)  评论(0编辑  收藏  举报