题目列表

手机

直接打表即可。

注意输入用 getline,判断空格。

代码

#include<bits/stdc++.h>
using namespace std;
string s;
char c;
int main()
{
    freopen("iphone.in","r",stdin);
    freopen("iphone.out","w",stdout);
    getline(cin,s);
    for(int i=0;i<s.size();i++)
    {
        c=s[i];
        if(c=='A')cout<<"2";
        else if(c=='B')cout<<"22";
        else if(c=='C')cout<<"222";
        else if(c=='D')cout<<"3";
        else if(c=='E')cout<<"33";
        else if(c=='F')cout<<"333";
        else if(c=='G')cout<<"4";
        else if(c=='H')cout<<"44";
        else if(c=='I')cout<<"444";
        else if(c=='J')cout<<"5";
        else if(c=='K')cout<<"55";
        else if(c=='L')cout<<"555";
        else if(c=='M')cout<<"6";
        else if(c=='N')cout<<"66";
        else if(c=='O')cout<<"666";
        else if(c=='P')cout<<"7";
        else if(c=='Q')cout<<"77";
        else if(c=='R')cout<<"777";
        else if(c=='S')cout<<"7777";
        else if(c=='T')cout<<"8";
        else if(c=='U')cout<<"88";
        else if(c=='V')cout<<"888";
        else if(c=='W')cout<<"9";
        else if(c=='X')cout<<"99";
        else if(c=='Y')cout<<"999";
        else if(c=='Z')cout<<"9999";
        else if(c==' ')cout<<"0";
    }
    return 0;
}

方方游戏

模拟。

对于将下落的方块,找出最先触碰底方块的,然后直接下移。

注意细节,比如最底层先铺上方块,初始方块高度大概放三四百。

代码

#include<bits/stdc++.h>
#define min(x,y) x<y?x:y
#define max(x,y) x>y?x:y
using namespace std;
int mp[400][200];
int y,x,dx,ux,ly,ry,cnt,num=400,w,n,m;
void down()
{
    for(int j=1;j<=w;j++)
    {
        int _x_=400;
        for(int i=dx;i<=ux;i++)
        {
            if(mp[i][j]==2)
            {
                _x_=i;
                break;
            }
        }
        for(int i=100;i>=0;i--)
        {
            if(mp[i][j]==1)
            {
                num=min(num,_x_-i);
                break;
            }
        } 
    }
    for(int i=dx;i<=ux;i++)
    {
        for(int j=ly;j<=ry;j++)
        {
            if(mp[i][j]==2)
            {
                mp[i-num+1][j]=1;
            }
        }
    }
    for(int i=1;i<=100;i++)
    {
        bool f=0;
        for(int j=1;j<=w;j++)
        {
            if(mp[i][j]!=1)
            {
                f=1;
                break;
            }
        }
        if(f==0)cnt++;
    }
    cout<<cnt<<endl;
}
int main()
{
    freopen("square.in","r",stdin);
    freopen("square.out","w",stdout);
    cin>>w>>n>>m;
    for(int i=0;i<=w;i++)
    {
        mp[0][i]=1;
    }
    for(int i=1;i<=n;i++)
    {
        int x_,y_;
        cin>>x_>>y_;
        mp[x_][y_]=1;
    }
    cin>>y;
    ly=ry=y;
    ux=dx=x=220;
    mp[x][y]=2;
    for(int i=1;i<m;i++)
    {
        int _x,_y;
        cin>>_x>>_y;
        mp[x+_x][y+_y]=2;
        ly=min(ly,y+_y);ry=max(ry,y+_y);
        dx=min(dx,x+_x);ux=max(ux,x+_x);
    }
    down();
    return 0;
}

传球

NOIp……原……原题?

洛谷 P1057

$f_{i,j}$ 表示第 $i$ 轮求球在 $j$ 手上方案数。

代码

#include<bits/stdc++.h>
using namespace std;
long long f[50][50];
int main()
{
    freopen("ball.in","r",stdin);
    freopen("ball.out","w",stdout);
    int n,m;
    cin>>n>>m;
    f[0][n]=1;
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(j==1)f[i][j]+=f[i-1][n];
            else f[i][j]+=f[i-1][j-1];
            if(j==n)f[i][j]+=f[i-1][1];
            else f[i][j]+=f[i-1][j+1];
        }
    }
    cout<<f[m][n]<<endl;
    return 0;
}

找位置

最短路。

找到了所有商店到其他店的最短路径,由于 $k\leq5$,所以直接全排列枚举路线。

tnnd,一个最短路调一晚上。

代码

#include<bits/stdc++.h>
#define min(x,y) x<y?x:y
#define max(x,y) x>y?x:y
using namespace std;
bool b[10020];
bool vis[10020];
int p[20],order[20];
int f[20][10020];
int u,v,w;
int n,m,k;
struct node
{
    int v,w;
};
vector<node>a[10020];
void dijk(int s)
{
    memset(vis,0,sizeof(vis));
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
    f[s][p[s]]=0;
    q.push(make_pair(0,p[s]));
    while(!q.empty())
    {
        u=q.top().second;
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(auto i:a[u])
        {
            v=i.v;
            w=i.w;
            if(f[s][u]+w<f[s][v])
            {
                f[s][v]=f[s][u]+w;
                q.push(make_pair(f[s][v],v));
            }
        }
    }
}
int main()
{
    freopen("relocation.in","r",stdin);
    freopen("relocation.out","w",stdout);
    memset(f,0x3f,sizeof(f));
    cin>>n>>m>>k;
    for(int i=1;i<=k;i++)
    {
        cin>>p[i];
        b[p[i]]=1;
        order[i]=i;
    }
    for(int i=1;i<=m;i++)
    {
        cin>>u>>v>>w;
        a[u].push_back({v,w});
        a[v].push_back({u,w});
    }
    for(int i=1;i<=k;i++)
    {
        dijk(i);
    }
    int ans=INT_MAX;
    do
    {
        for(int i=1;i<=n;i++)
        {
            int sum=0;
            if(b[i])continue;
            sum+=f[order[1]][i];
            for(int j=2;j<=k;j++)
            {
                sum+=f[order[j-1]][p[order[j]]];
            }
            sum+=f[order[k]][i];
            ans=min(ans,sum);
        }
    }while(next_permutation(order+1,order+k+1));
    cout<<ans<<endl;
    return 0;
}

最后修改:2023 年 04 月 23 日
v我50吃疯狂星期四