备战

//精度控制 二分
#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
double hs(double x,double y)
{
    return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;
}
double ds(double x,double y)
{
    return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*pow(x,1)-y;
}
int main(){
    int a;
    cin>>a;
    while(a--)
    {
        double b,x,y,z;
        cin>>b;
        x = 0.0;
        y = 100.0;
        while(y-x>eps){
        z = (x+y)/2;
        if(ds(z,b)>0){
            y = z;
        }
        else{
            x = z;
        }
        }
        printf("%.4lf\n",hs(z,b));
    }
    return 0;
}
//并查集
#include<bits/stdc++.h>
using namespace std;
int parent[1000];
int res;
int i;
int n,Pair;

int find(int x)
{
    return (x==parent[x])?x:(parent[x]=find(parent[x]));
}
void unite(int x,int y)
{
    x = find(x);
    y = find(y);
    if(x!=y)
    {
        parent[x] = y;
        res--;
    }
}
void init(){
    scanf("%d%d",&n,&Pair);
    res = n;
    for(i=1;i<=n;i++)
    {
        parent[i]=i;
    }
}
int main(){
    int t;
    cin>>t;
    while(t--)
    {
        init();
        for(i=1;i<=pair;i++)
        {
            int num1,num2;
            scanf("%d%d",&num1,&num2);
            unite(num1,num2);
        }
        printf("%d\n",res);
    }
}

 

//快速幂
long long PowerMod(long long a,long long b,long long c)
{
    int ans = 1;
    a = a%c;
    while(b>0)
    {
        if(b%2==1)
        {
            ans = (ans*a)%c;
        }
        b/=2;
        a =(a*a)%c;
    }
    return ans;
}

 

//三分求解
#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
//凹函数
double hs(double x,double y)
{
    return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;
}
int main(){
    int a;
    cin>>a;
    while(a--){
        double l,r,mid,midmid,b;
        cin>>b;
        l = 0.0;
        r = 100.0;
        while(r-l>eps){
            mid = (l+r)/2;
            midmid = (mid+r)/2;
            if(hs(mid,b)>hs(midmid,b))l=mid;
            else r = midmid;
        }
        cout<<hs(mid,b);
    }
    return 0;
}
//自定义优先队列,运算符重载
#include<bits/stdc++.h>
using namespace std;
struct node{
    int x;
    int y;
    friend bool operator <(const node a,const node b){
        if(a.x!=b.x){
            return b.x<a.x;
        }else{
            return b.y>a.y;
        }
    }
    };
int main(){
    priority_queue<node> que;
    node nodeList[6];
    for(int i=1;i<6;i++)
    {
        node newNode;
        newNode.x = i;
        newNode.y = i;
        que.push(newNode);
    }
    node newNode;
    newNode.x = 3;
    newNode.y = 4;
    que.push(newNode);
    while(!que.empty())
    {
        node node1 = que.top();
        que.pop();
        cout<<node1.x<<" "<<node1.y<<endl;
    }

}
//优先队列
#include<bits/stdc++.h>
using namespace std;
int main(){
    priority_queue<int,vector<int>,less<int> >c;//大顶堆,先返回大的
    priority_queue<int,vector<int>,greater<int> >c;//小顶堆,先返回小的
    for(int i=0;i<10;i++)
    {
        c.push(rand());
    }
    while(!c.empty())
    {
        cout<<c.top();
        c.pop();
        cout<<endl;
    }
    return 0;
}
//Dijkstra(迪杰斯特拉)算法求最短路径
//是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10001;
const int inf = 0x3f3f3f3f;
int mapp[maxn][maxn];
int dis[maxn];
int vis[maxn];
int N,M;
void init(){
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=N;j++)
        {
            if(i==j)mapp[i][j]=0;
            else mapp[i][j]=inf;
        }
    }
}
void dijkstra(){
    int flag;
    vis[1]=1;
    for(int i=1;i<=N;i++){
        dis[i]=mapp[1][i];
    }
    for(int i=1;i<=N;i++){
        int minn = inf;
        for(int j=1;j<=N;j++){
            if(!vis[j]&&dis[j]<minn)
            {
                minn = dis[j];
                flag = j;
            }
        }
    //注意在括号外
        vis[flag] = 1;
        for(int v=1;v<=N;v++){
            if(!vis[v]&&dis[v]>vis[flag]+mapp[flag][v])//注意是dis[v]
                dis[v] = dis[flag]+mapp[flag][v];
        }
    }
}
int main(){
    int u,v,w;
    while(~scanf("%d%d",&N,&M))
    {
        if(N==0&&M==0)break;
        memset(vis,0,sizeof(vis));
        init();
        for(int i=1;i<=M;i++)
        {
            cin>>u>>v>>w;
            if(mapp[u][v]>w)
            {
                mapp[u][v]=mapp[v][u]=w;
            }
        }
        dijkstra();
        cout<<dis[N]<<endl;
    }
}

 

//Floyd算法求最短路径
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1144;
const int inf = 0x3f3f3f3f;
int dis[102][102];
int n,m,a,b;
void init(){
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i!=j)dis[i][j]=inf;
            else    dis[i][j]=0;
        }
    }
}
void Floyd(int n){
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            for(int k=0;k<n;k++)
            {
                if(dis[j][k]>dis[j][i]+dis[i][k])
                    dis[j][k] = dis[j][i]+dis[i][k];
            }
        }
    }
}
int main(){
    while(~scanf("%d%d",&n,&m))
    {
        int flag=0;
        init();
        while(m--)
        {
            cin>>a>>b;
            dis[a][b] = dis[b][a]=1;
        }
        Floyd(n);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(dis[i][j]>7)
                {
                    flag=1;
                    break;
                }
            }
        }
        if(flag==0)cout<<"Yes"<<endl;
        else       cout<<"No"<<endl;
    }
}
//Kruskal算法求最小生成树
#include<bits/stdc++.h>
using namespace std;
const int maxn = 30;
const int inf = 0x3f3f3f3f;
struct road{
    int st;
    int ed;
    double value;
}roads[80];
int n;
int parent[maxn];
void init()
{
    for(int i=0;i<n;i++)
    {
        parent[i] = i;
    }
}
bool cmp(road a,road b)
{
    if(a.value<b.value)return true;
    else false;
}
int Find(int x)
{
    return (x==parent[x])?x:(parent[x]=Find(parent[x]));
}
bool Merge(int a,int b)
{
    a = Find(a);
    b = Find(b);
    if(a==b)return false;
    else parent[a] = b;
    return true;
}
int Kruskal(int N,int M)//N表示定点数,M表示边数
{
    int num=0;
    int cost=0;
    sort(roads,roads+M,cmp);
    for(int i=0;i<M;i++)
    {
        if(Merge(roads[i].st,roads[i].ed))
        {
            num++;
            cost+=roads[i].value;
        }
        if(num==N-1)break;
    }
    if(num!=N-1)return -1;
    else return cost;
}
int main(){
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        init();
        char s,e;
        int num,cost,k=0;
        for(int i=0;i<n-1;i++)
        {
            cin>>s>>num;
            for(int j=0;j<num;j++,k++)
            {
                cin>>e>>cost;
                roads[k].st = s-'A';
                roads[k].ed = e-'A';
                roads[k].value = cost;
            }
        }
        sort(roads,roads+k,cmp);
        int res = Kruskal(n,k);
        printf("%d\n",res);
    }
    return 0;
}
//Dijkstra+路径记录
#include<bits/stdc++.h>
using namespace std;
const int maxn = 30;
const int inf = 0x3f3f3f3f;
int vis[510];
int mapp[510][510],dis[510];
int money[510][510],cost[510];
int n,m,st,ed;
int pre[510];
vector<int>path;
void dfs(int v)
{
    if(v==st)
    {
        path.push_back(v);
        return;
    }
    dfs(pre[v]);
    path.push_back(v);
}
void dijkstra(int s)
{
    int flag;
    fill(dis,dis+510,inf);
    dis[s] = 0;
    cost[s] = 0;
    for(int i=0;i<n;i++)
    {
        int minn=inf;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&dis[i]<minn)
            {
                flag=i;
                minn=dis[i];
            }
        }
        vis[flag]=1;
        for(int i=0;i<n;i++)
        {
            if(!vis[i]&&mapp[flag][i])
            {
                if(dis[i]>dis[flag]+mapp[flag][i])
                {
                    dis[i]=dis[flag]+mapp[flag][i];
                    cost[i]=cost[flag]+money[flag][i];
                    pre[i]=flag;
                }
                else if(dis[i]==dis[flag]+mapp[flag][i])
                {
                    if(cost[flag]+money[flag][i]<cost[i])
                    {
                    cost[i]=cost[flag]+money[flag][i];
                    pre[i]=flag;
                    }
                }
            }
        }
    }
}
int main(){
    cin>>n>>m>>st>>ed;
    for(int i=0;i<m;i++)
    {
        int a,b,c,d;
        cin>>a>>b>>c>>d;
        mapp[a][b]=mapp[b][a]=c;
        money[a][b]=money[b][a]=d;
    }
    dijkstra(st);
    dfs(ed);
    for(int i=0;i<path.size();i++)
    {
        cout<<path[i]<<" ";
    }
    cout<<dis[ed]<<" "<<cost[ed];
}
//完全背包
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
const int inf = 0x3f3f3f3f;
int dp[25005],v[maxn],n[maxn];
int main(){
    int N;
    while(~scanf("%d",&N)&&N>=0)
    {
        memset(dp,0,sizeof(dp));
        memset(v,0,sizeof(v));
        memset(n,0,sizeof(n));
        int sum = 0;
        for(int i=1;i<=N;i++)
        {
            scanf("%d%d",&v[i],&n[i]);
            sum+=v[i]*n[i];
        }
        int V=sum/2;
        for(int i=1;i<=N;i++)//每一件物品
        {
            for(int k=1;k<=n[i];k++)//件数
            {
                for(int j=V;j>=v[i];j--)//大于这个物品的空间
                {
                    dp[j] = max(dp[j],dp[j-v[i]]+v[i]);
                }
            }
        }
        printf("%d %d\n",sum-dp[V],dp[V]);
    }
}
//0-1背包
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
const int inf = 0x3f3f3f3f;
int value[maxn];
int dp[250005];
int main(){
    int N;
    int m,n;
    while(scanf("%d",&N)&&N>=0)
    {
        memset(value,0,sizeof(value));
        memset(dp,0,sizeof(dp));
        int item = 0;
        int sum = 0;
        for(int i=0;i<N;i++)
        {
            cin>>m>>n;
            while(n--)
            {
                value[item++]=m;
                sum+=m;
            }
        }
        for(int i=0;i<item;i++)
        {
            for(int j=sum/2;j>=value[i];j--)
            {
                dp[j]=max(dp[j],dp[j-value[i]]+value[i]);
            }
        }
        printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
    }
    return 0;
}
//素数筛
    memset(isprime,true,sizeof(isprime));
    for(int i=2;i<10001;i++)
    {
        if(isprime[i])
        {
           for(int j=i*2;j<10010;j+=i)
           {
               isprime[j] = false;
           }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值