题目列表
手机
直接打表即可。
注意输入用 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……原……原题?
$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;
}