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;
}