天梯赛
7-1 判断素数
注意点:
1.1既不是素数也不是和数,所以要特殊判断1
2.循环暂停条件 i*i<=m
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
//const int N = 1000000000 + 5;
int main()
{
speed_up;
int n;
cin>>n;
long long i;
while(n--)
{
long long m;
cin>>m;
for(i=2;i*i<=m;i++)
{
if(m%i==0)
{
break;
}
}
if(i*i>m&&m!=1){cout<<"Yes"<<endl;}
else{cout<<"No"<<endl;}
}
}
7-10 抢红包
注意:
设置一个double money ;
最后再money/100;
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
//const int N = 1000000000 + 5;
struct people
{
int num;
int sum=0;
double money=0;
};
/*int comp(people& p1,people& p2)
{
if(p1.money>p2.money)
{
return 1;
}
if(p1.money<p2.money)
{
return 0;
}
if(p1.money==p2.money)
{
if(p1.sum<p2.sum)
{
return 1;
}
if(p1.sum>p2.sum)
{
return 0;
}
if(p1.sum==p2.sum)
{
if(p1.num<p2.num)
{
return 1;
}
else
{
return 0;
}
}
}
}*/
bool comp(people p1,people p2)
{
if((p1.money==p2.money)&&(p1.sum==p2.sum))
return p1.num<p2.num;
else if(p1.money==p2.money)
return p1.num>p2.num;
else return p1.money>p2.money;
}
int main()
{
int n,i,j;
cin>>n;
people p[n];
for(i=0;i<n;i++)
{
int k;
cin>>k;
p[i].num=i;
for(j=0;j<k;j++)
{
int n1;
double p1;
cin>>n1>>p1;
p[n1-1].num=n1-1;
p[i].money=p[i].money-p1;
p[n1-1].sum++;
p[n1-1].money=p[n1-1].money+p1;
}
}
sort(p,p+n,comp);
for(i=0;i<n;i++)
{
cout<<p[i].num+1<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<p[i].money/100<<endl;
}
}
7-9 小字辈
(看的大佬的思路)
1.把输入的数据利用vector储存,在输入期间标记老祖宗的下标
2.创建一个数组,这个数组标记每个人的辈分利用这个辈分找到我们所要的最小辈分这里我们先把老祖宗的辈分设为1
3.我们先把老祖宗的下标入队,看老祖宗这哥数组有几个元素,利用向下搜索
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
vector<int>v[200005];
int vv[100005];
queue<int>q;
int main()
{
int n,x,lzz;//lzz 记录老祖宗
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>x;
if(x==-1)lzz=i;
else
v[x].push_back(i);
}
if(n==1)
{
cout<<"1"<<endl;
cout<<"1";
return 0;
}
q.push(lzz);
int bfen=1; //统计辈分
vv[lzz]=1;
while(!q.empty())
{
int temp = q.front();
q.pop();
for(int i=0;i<v[temp].size();i++)
{
vv[v[temp][i]] = vv[temp]+1;//更新每个人的辈分
bfen = max(bfen,vv[v[temp][i]]);//更新(获得)最小辈分的值
q.push(v[temp][i]);//把下一次要遍历的入队
}
}
cout<<bfen<<endl;
int flag = 0;
for(int i=1;i<=n;i++)
{
if(vv[i]==bfen)
{
if(!flag)
{
cout<<i;
flag = 1;
}
else
cout<<" "<<i;
}
}
}
7-12 深入虎穴
(看的大佬的代码)
1.有给定入口,需要新增标记数组(跟小字辈几乎做法一样)
2.出口一定在输入k为0的门上,这样我们可以在用一个动态数组来保存这些后面没有门的点,然后从后往前搜
#include <bits/stdc++.h>
#define pb push_back
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
int n,vis[100010],root,num[100010],maxx,ff;
vector<int> vi[100010];
void dfs(int nn,int fa)
{
if(vi[fa].size()==0)
{
if(num[fa]>maxx)
{
maxx=num[fa];
ff=fa;
}
return ;
}
for(int i=0;i<vi[fa].size();i++)
{
num[vi[fa][i]]=num[fa]+1;
dfs(nn+1,vi[fa][i]);
}
return ;
}
int main()
{
// freopen("D:\\LYJ.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x;
while(x--)
{
cin>>y;
vi[i].pb(y);
vis[y]=1;
}
}
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
root=i;
num[root]=1;
break;
}
}
dfs(2,root);
// for(int i=1;i<=n;i++) cout<<num[i]<<" ";
cout<<ff;
return 0;
}
rating 赛
B - Power Sequence
排序之后再枚举
(看的大佬的代码)
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef pair<int, int> PII;
#define x first
#define y second
const int N = 500007, M = 5000007;
const long long INF = 1e14;
int n, m;
long long a[N];
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>a[i];
}
long long ans=INF;
int t=pow(INF,1.0/n);
sort(a+1,a+1+n);
for(int c=1;c<=t;++c)
{
long long sum=0, tmp=1;
for(int i=1;i<=n;++i)
{
sum +=abs(a[i]-tmp);
tmp *=c;
}
ans=min(ans,sum);
}
cout<<ans<<endl;
return 0;
}
F - Basketball Exercise
(看的网上大佬的思路)
前i个学生的时候身高和最大,那么前i-1个学生的身高和要是最大
如果上一次选择的是第一排的学生,那么这一次只能选择第二排的学生,或者不选
求解时加上第一排第i个学生的身高,如果这次要选择不选,那么要求面对前i-1人时第一排的答案最优,否则面对第i个人的时候不是最优解,那么在选择这两种方式的时候选择大的就是这一次的最优解。两排都同时进行一次DP,最后取两者中大的即可。
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=1e5+5;
long long h1[N],h2[N];
long long f[N],g[N];
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int i,n;
cin>>n;
for(i=1;i<=n;i++) cin>>h1[i];
for(i=1;i<=n;i++) cin>>h2[i];
f[0]=g[0]=0;
for(i=1;i<=n;i++)
{
f[i]=max(f[i-1],g[i-1]+h1[i]);
g[i]=max(g[i-1],f[i-1]+h2[i]);
}
cout<<max(f[n],g[n])<<endl;
return 0;
}