开始: 2024-06-16 14:30:00

20240616

结束: 2024-06-16 17:30:00
当前: 2025-0505-3030 11:45:00  类型:单人排位赛 状态:已经结束 

A-回文素数

#include<bits/stdc++.h>
using namespace std; 
bool isprime(int n)
{
if(n < 2) return false;
if(n == 2) return true;
for(int i = 2; i*i <= n; ++i)
{
if(n % i == 0) return false;
}
return true;
}

int huiwen(int n)//构造回文数,逆序输出n
{
int s=0;
while(n != 0)
{
s = s*10 + n%10;
n = n/10;
}
return s;
}

int main()
{
int n, sum = 0;
scanf("%d",&n);
for(int i = 11; i <= n; ++i)
{
if(isprime(i) && isprime(huiwen(i)))
{
//printf("%d\n",i);
sum++;
}
}
printf("%d",sum);
return 0;
}

B-考试

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,q;
string timu[1001],daan[1001];
cin>>n;
for(int i=1;i<=n;i++)
cin>>timu[i]>>daan[i];
for(int i=1;i<=n;i++)
{
string t,a,b,c,d;
int flag;
cin>>t>>a>>b>>c>>d;
for(int j=1;j<=n;j++)
{
if(t==timu[j]){
flag=j;
break;}
}
if(daan[flag]==a) cout<<"A"<<endl;
if(daan[flag]==b) cout<<"B"<<endl;
if(daan[flag]==c) cout<<"C"<<endl;
if(daan[flag]==d) cout<<"D"<<endl;
}
return 0;
}

C-礼物

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[11]={0};//一开始每个人都赚了0元
for(int i=1;i<=n;i++)
{
int s,m;
cin>>s>>m;
if(m==0) continue;//如果不给任何人送礼 直接continue 避免发生除以0的情况
//注意 若s==0 不要直接continue 会导致没有输入接下来的m个数
int t=s/m;//算出要给每个人送的钱
a[i]-=m*t;//i这个人亏了这么多钱
for(int j=1;j<=m;j++)
{
int x;
cin>>x;
a[x]+=t;//x这个人赚了t元
}
}
for(int i=1;i<=n;i++) cout<<a[i]<<endl;
return 0;
}

D-记忆力

二分答案裸题,几乎和1960-1962一模一样,复习二分答案部分即可解答。

#include <bits/stdc++.h>
using namespace std;
int n, m, l, r, mid, maxmin, a[100010];
bool check(int x)
{
int cnt = 0, ans = 1;
for (int i=1; i<=n; i++)
{
if (cnt + a[i] > x) cnt = 0, ans ++;
cnt += a[i];
}
return ans <= m;
}
int main()
{
scanf ("%d%d", &n, &m);
for (int i=1; i<=n; i++)
{
scanf ("%d", &a[i]);
l = max(l, a[i]);
r += a[i];
}
while (l <= r)
{
mid = (l + r) / 2;
if (check(mid)) maxmin = mid, r = mid - 1;
else l = mid + 1;
}
printf ("%d\n", maxmin);
return 0;
}

E-坐火车

首先要看懂题,记录的m条是没有先后顺序的,也就是说可以把每个站总共上了多少人、下了多少人算出来。

定义一个数组up[i]表示i这个站上的人数,down[i]表示i这个站下的人数,显然对于每条记录有up[x] += z; down[y] += z;

然后再从头到尾枚举一遍,维护当前的总人数,people += up[i]; people -= down[i];

但这里有个问题是这道题是环线,所以x有可能大于y,在这种情况下,这些人会从第n个站回到第1个站,但如果我们统计people的时候从1到n枚举,显然这些人还没加上就被减去了。

所以对于x>y的情况,在处理up和down数组的时候,还需要有up[1]+=z,表示这些人又回到了第一个站。

#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,z;
int up[1000010],down[1000010],maxx,temp;
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;++i)
{
scanf("%d%d%d",&x,&y,&z);
if(x>y) up[1]+=z;
up[x]+=z;
down[y]+=z;
}
for(int i = 1;i <= n;++i)
{
temp+=up[i]-down[i];
maxx=max(maxx,temp);
}
printf("%d",maxx%36==0?maxx/36:maxx/36+1);
return 0;
}