第三次

36 篇文章 0 订阅
4 篇文章 0 订阅

D 枚举转化

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[2][20];
ll n;
int main(){
    scanf("%lld",&n);a[0][0]=1;ll c=n;ll b=0;
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[0][i]);
    }
    int now=0;
    while(n>0){
        int flag=1;
        for(ll i=-10;i<=10;i++){
            ll ans=0;
            for(ll j=0;j<=n;j++){
                ans+=pow(i,(n-j))*a[now][j];
            }
            if(ans==0){
                //cout<<"i=  "<<i<<endl;
                flag=0;n--;a[now^1][0]=a[now][0];
                for(int k=1;k<=n;k++){
                    a[now^1][k]=a[now][k]+i*a[now^1][k-1];
                }
                now^=1;b++;break;
            }
        }
        if(flag) break;
    }
    printf("%lld\n",c-b);
}
/**************************************************************
    Problem: 1706
    User: ALPC_t_1
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1496 kb
****************************************************************/

F:枚举加多项式除法

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[2][20];
ll n;
int main(){
    scanf("%lld",&n);a[0][0]=1;ll c=n;ll b=0;
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[0][i]);
    }
    int now=0;
    while(n>0){
        int flag=1;
        for(ll i=-10;i<=10;i++){
            ll ans=0;
            for(ll j=0;j<=n;j++){
                ans+=pow(i,(n-j))*a[now][j];
            }
            if(ans==0){
                //cout<<"i=  "<<i<<endl;
                flag=0;n--;a[now^1][0]=a[now][0];
                for(int k=1;k<=n;k++){
                    a[now^1][k]=a[now][k]+i*a[now^1][k-1];
                }
                now^=1;b++;break;
            }
        }
        if(flag) break;
    }
    printf("%lld\n",c-b);
}
/**************************************************************
    Problem: 1706
    User: ALPC_t_1
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1496 kb
****************************************************************/

I
map

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e6+5;
//short int a[maxn];int n,k;
int n,k;map<int,int>m;
int main(){
    scanf("%d%d",&n,&k);int b;
    for(int i=1;i<=n;i++){
        scanf("%d",&b);m[b]++;
    }
    for(map<int,int>::iterator it =m.begin();it!=m.end();it++){
        if((*it).second%k!=0){
            printf("%d\n",*it);return 0;
        }
    }


}
/**************************************************************
    Problem: 1709
    User: ALPC_t_1
    Language: C++
    Result: Accepted
    Time:24 ms
    Memory:1756 kb
****************************************************************/

H:忘记处理有的座位没有卖票的情况了,这样所有站最远都可以直接到达n,少push了,坑了我这么久,哎,还是写的太残了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+5;
int n,t,k;
struct node{
    int a,b,c;
}aa[maxn];
struct Node{
    int a,b;
}bb[maxn];
vector<Node>vec;
bool Cmp(Node x,Node y){
    return x.b>y.b;
}
int f1[maxn],f2[maxn];
bool cmp(node x,node y){
    if(x.a==y.a){
        if(x.b==y.b) return x.c<y.c;
        return x.b<y.b;
    }
    return x.a<y.a;
}
int vis[maxn], lv[maxn];
int main(){
    //freopen("007.in","r",stdin);
    scanf("%d%d%d",&k,&n,&t);memset(vis,0,sizeof(vis));
    for(int i=1;i<=t;i++){
        scanf("%d%d%d",&aa[i].a,&aa[i].b,&aa[i].c);
        vis[aa[i].a]=1;
    }
    for(int i=1;i<=n;i++){
        f2[i]=i;f1[i]=i;
    }
    sort(aa+1,aa+1+t,cmp);int count=0;
    aa[0].a=0;aa[t+1].a=0;
    for(int i=1;i<=t;i++){
        vis[aa[i].a]=1;
        if((aa[i].a!=aa[i-1].a)&&aa[i].b>1){
            vec.push_back(Node{1,aa[i].b});
        }
        if(aa[i].a==aa[i+1].a&&(aa[i].c<aa[i+1].b)){
            vec.push_back(Node{aa[i].c,aa[i+1].b});
        }
        if((aa[i].a!=aa[i+1].a)&&(aa[i].c<n)){
            vec.push_back(Node{aa[i].c,n});
        }
    }
    for(int i=1;i<=k;i++){
        if(!vis[i]){
            vec.push_back(Node{1,n});
        }
    }
    sort(vec.begin(),vec.end(),Cmp);
    int now=(int)vec.size();
    for(int i=0;i<vec.size();i++){
        for(int j=vec[i].b;j>=vec[i].a;j--){
            f1[j]=max(f1[j],vec[i].b);
            f2[j]=max(f2[j],f2[f2[vec[i].b]]);
        }
    }
    ll ans=0;
    for(int i=1;i<=n;i++){
         ans+=(f2[i]-f1[i]);
    }
    printf("%lld\n",ans);
}
/**************************************************************
    Problem: 1708
    User: ALPC_t_1
    Language: C++
    Result: Accepted
    Time:164 ms
    Memory:5404 kb
****************************************************************/

E:
最短路加状压dp,用优先队列优化,随机T~~~

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int inf=0x7f7f7f7f;
const int maxn=2e4+10;
int n,m,op,u,v,w,cost,num;
struct node{
    int v,w;
    bool operator < (const  node &  a ) const{
         return w>a.w;
    }
};
vector<node>a[maxn];priority_queue<node>q;
int p[maxn],dis[20][maxn];int vis[maxn];
int dp[1<<16][16][4];
void bfs(int x){
    for(int i=0;i<n;i++){
        dis[x][i]=inf;vis[i]=0;
    }
    dis[x][p[x]]=0;
    q.push(node{p[x],0});
    while(!q.empty()){
        node now=q.top();q.pop();
        if(vis[now.v]) continue ;vis[now.v]=1;
        for(int i=0;i<a[now.v].size();i++){
            int v=a[now.v][i].v;
            if(dis[x][v]>dis[x][now.v]+a[now.v][i].w){
                dis[x][v]=dis[x][now.v]+a[now.v][i].w;
                q.push(node{v,dis[x][v]});
            }
        }
    }
}
int solve(){
    for(int i=0;i<=num;i++){
        bfs(i);
    }
    for(int i=0;i<(1<<num);i++){
        for(int j=0;j<num;j++){
            for(int k=0;k<4;k++){
                dp[i][j][k]=inf;
            }
        }
    }
    for(int i=0;i<num;i++){
        dp[1<<i][i][0]=dis[num][p[i]]+cost;
    }
    for(int i=1;i<(1<<num);i++){
        for(int j=0;j<num;j++){
            if(!(i&(1<<j))) continue;
            for(int c=0;c<4;c++){
                if(dp[i][j][c]==inf) continue;
                for(int k=0;k<num;k++){
                    if(i&(1<<k)) continue;
                    int st=i|(1<<k);
                    dp[st][k][0]=min(dp[st][k][0],dp[i][j][c]+dis[num][p[k]]+cost);
                    if(c<3){
                        dp[st][k][c+1]=min(dp[st][k][c+1],dp[i][j][c]+dis[j][p[k]]);
                    }
                }
            }
        }
    }
    int ans=inf;
    int st=(1<<(num))-1;
    for(int i=0;i<num;i++){
        for(int j=0;j<=3;j++){
            ans=min(ans,dp[st][i][j]);
        }
    }
    return ans;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d%d",&op,&u,&v,&w);u--;v--;
        a[u].push_back(node{v,w});
        if(op==2) a[v].push_back(node{u,w});
    }
    int st;
    scanf("%d%d%d",&cost,&st,&num);st--;
    for(int i=0;i<num;i++){
        scanf("%d",&p[i]);p[i]--;
    }
    p[num]=st;
    int ans=solve();
    printf("%d\n",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值