CF987

A.字面意思,就模拟一下就好

#include <bits/stdc++.h>

using namespace std;

char s[100];
int vis[100];
int main()
{
    int n;
    scanf("%d",&n);

    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;++i)
    {
        scanf("%s",s);
        if(s[0]=='p') vis[1]=1;
        if(s[0]=='g') vis[2]=1;
        if(s[0]=='b') vis[3]=1;
        if(s[0]=='o') vis[4]=1;
        if(s[0]=='r') vis[5]=1;
        if(s[0]=='y') vis[6]=1;
    }
    int ans=0;
    for(int i=1;i<=6;++i)
    {
        if(vis[i]) continue;
        else
        {
            ans++;
        }
    }

    printf("%d\n",ans);
    for(int i=1;i<=6;++i)
    {
        if(vis[i]) continue;
        else
        {
            if(i==1) printf("Power\n");
            if(i==2) printf("Time\n");
            if(i==3) printf("Space\n");
            if(i==4) printf("Soul\n");
            if(i==5) printf("Reality\n");
            if(i==6) printf("Mind\n");

        }
    }
    return 0;
}

B

x的y次方,和y的x次方比大小,直接比较会崩,两边取个log就行了

#include <bits/stdc++.h>
using namespace std;

const double eps=1e-6;

int cmp(double a, double b)
{
    if(a-b>eps) return 1;
    if(b-a>eps) return -1;
    return 0;
}

int main()
{
    double a,b;
    scanf("%lf%lf",&a,&b);
    double e=2.718281828459;
    if(cmp(a*log(b),b*log(a))==1) printf("<\n");
    else if(cmp(a*log(b),b*log(a))==-1) printf(">\n");
    else printf("=\n");
    return 0;
}

C.

满足 i<J<K 和 si<sj<sk 的同时 ,求ci+cj+ck的最小值。

因为是cf,加上今天手感不错,就直接三分钟暴力莽了一波。 

结果T,冷静了三十s,就想到了dp, 

相对于传统的dp,这个dp要多做一遍即可。

emmmm 这可能是我出的最快的一道dp了。

#include <bits/stdc++.h>
using namespace std;
const int maxn=3010;
const int inf=0x3f3f3f3f;
int n;
struct node
{
    int a,b;
}s[maxn];
int dp[maxn][5];

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&s[i].a);
    }
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&s[i].b);
    }
    memset(dp,inf,sizeof(dp));

    for(int i=1;i<=n;++i)
    {
        dp[i][1]=s[i].b;
    }

    for(int i=1;i<=n;++i)
    {
        for(int j=i+1;j<=n;++j)
        {
            if(s[j].a>s[i].a)
            {
                for(int k=2;k<=3;++k)
                {
                    dp[j][k]=min(dp[j][k],dp[i][k-1]+s[j].b);
                }
            }
        }
    }
    int ans=inf;
    for(int i=1;i<=n;++i)
    {
        ans=min(ans,dp[i][3]);
    }
    if(ans==inf) printf("-1\n");
    else printf("%d\n",ans);
    return 0;
}

D.

n个村子,m条路,k种特产,求从任意一个村子出发得到s种特产的费用。ai表示第i个村子能生产第ai种特产。

当时一拿到题,就想水题!

对每一个村子求个最短路,然后标记+sort一下,结果T成zz(莽了一个半小时,后面CF还崩了)。

因为这样的话要做n遍最短路。


后来补题的时候发现,可以反过来,对特产求最短路,标记村子,这样至多做100遍最短路。

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6;
const int inf=0x3f3f3f3f;
vector<int> g[maxn];
vector<int> gg[maxn];
vector<int> a;
int n,m,k,s;
bool vis[maxn];
int dis[maxn][105];
void bfs(int st)
{
    memset(vis,0,sizeof(vis));
    queue<int> que;
    for(int i=0;i<g[st].size();i++)
    {
        int v=g[st][i];
        que.push(v);
        dis[v][st]=0; vis[v]=1;
    }
    while(!que.empty())
    {
        int u=que.front();
        que.pop();
        for(int i=0;i<gg[u].size();i++)
        {
            int v=gg[u][i];
            if(vis[v]) continue;
            else
            {
                vis[v]=1;
                dis[v][st]=dis[u][st]+1;
                que.push(v);
            }
        }
    }
}
int main()
{

    scanf("%d%d%d%d",&n,&m,&k,&s);

    for(int i=1;i<=n;++i)
    {
        int x;
        scanf("%d",&x);
        g[x].push_back(i);
    }
    for(int i=1;i<=m;++i)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        gg[x].push_back(y);   gg[y].push_back(x);
    }
    for(int i=1;i<=k;++i) bfs(i);
    for(int i=1;i<=n;++i)
    {
        a.clear();
        for(int j=1;j<=k;++j) a.push_back(dis[i][j]);
        sort(a.begin(),a.end());
        int cost=0;
        for(int j=0;j<s;++j) cost+=a[j];
        printf("%d",cost);

        if(i==n) printf("\n");
        else printf(" ");
    }
    return 0;
}

E

给定一串n的全排列A。

P将1 2 3.......n两两任意swap 3*n次, U将1 2 3.......n两两任意swap 7*n+1;

问:谁最有可能转换成A?


这里有个惊人的发现! 3*n和 7*n+1的奇偶性总是相反的。

所以我们只需要算一下1 2 3.....n到A的swap次数奇偶就可以了。

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
int a[maxn];
int b[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&a[i]);
        b[a[i]]=i;
    }
    int cnt=0;
    for(int i=1;i<=n;++i)
    {
        if(i!=a[i])
        {
            cnt++;

            int pos=b[i];
            a[pos]=a[i];
            b[a[i]]=pos;
            //a[i]=i;
        }
    }
    if(cnt%2== 3*n%2) printf("Petr\n");
    else  printf("Um_nik\n");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值