A困难的交换数
(纯签到题)
题解:
如果第一个元素是奇数,那么无需操作,输出 0 。
如果第一个元素是偶数,且后面有元素比它小,且是奇数,输出 1 。
否则,输出 -1 。
代码实现:
#include<stdio.h>
int num[110];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int f=0;
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
}
if(num[1]&1){
puts("0");
continue;
}
for(int i=2;i<=n;i++){
if(num[i]&1&&num[1]>num[i]){
puts("1");
f=1;
break;
}
}
if(!f)puts("-1");
}
return 0;
}
C小玩一手炉石传说字
(模拟题,直接写)
题意:
有n个随从,现进行m次攻击,初始攻击力为2,每次攻击从左至右攻击随从,若恰好击杀随从,则攻击力+1,攻击完随从后再攻击英雄。
要求输出:英雄受到多少点攻击。
可能需要注意的就是,敌方随从和对方英雄的区分,注意是求对英雄造成的伤害即可,对随从的伤害无需统计,不要搞混就可以很简单求出结果的。
代码实现:
#include<stdio.h>
int num[110];
int main(){
int n,m,sum=0,t=2;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(t==num[j]){
t++;
num[j]-=t;
}else{
num[j]-=t;
}
}
sum+=t;
}
printf("%d",sum);
return 0;
}
F你会不会打麻将呢?
样例解释:
以及理解0->1 1->0
(思维题+一些优化思维)
题意:
m种牌,对手操作q次,拿或者放入数字牌num,num对应的安全牌为num+3/num-3
问每次操作后有多少种安全牌
题解:
要用到标记计数。对于每个操作记录安全牌的数量,当安全牌数量从0变1说明种类增加。从1变0说明种类减少。
主要就是因为从0到1,从1到0会影响安全牌种类count的数目,所以不需要每一次操作后都遍历一遍来统计当时的安全牌数,只需要判断当时是不是造成了从0到1,从1到0即可;其次需要注意的是遍历必然超时,这点略微算一下时间复杂度就可以知道。
代码实现:
#include<stdio.h>
int st[100010],count;
int main(){
int m,q;
scanf("%d %d",&m,&q);
while(q--){
int op,x;
scanf("%d %d",&op,&x);
if(op==1){
if(x+3<=m){
if(st[x+3]==0)count++; st[x+3]++;
}
if(x-3>=1){
if(st[x-3]==0)count++;
st[x-3]++;
}
}else{
if(x+3<=m){
if(st[x+3]==1)count--;
st[x+3]--;
}
if(x-3>=1){
if(st[x-3]==1)count--;
st[x-3]--;
}
}
printf("%d\n",count);
}
return 0;
}
H防呀防不住_ak
样例解释:以及引入质因数分解思路
(质因数分解)
题解:
题目要求想知道这两个数组是否是相互独立,还给了个公式定义,又说由两个数组中各选一个数组成的数对的最大公因数是 1,看样子很难。
其实不难,就是求出a数组和b数组分解质因子后有无重合的项。
需要用到数组标记第一个数组所有数目出现过的质因子,再看第二个数组的数目质因子是否有重复的,就可以判断是否独立了。
后续补题,可以去看一下质因数分解的博客,比较重要。
代码实现:
#include<stdio.h>
int mp[1000010],a[100010],b[100010];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
{
for(int j=2;j<=a[i]/j;j++)
{
while(!(a[i]%j))
{
mp[j]++;
a[i]/=j;
}
}
if(a[i]>1)
{
mp[a[i]]++;
}
}
for(int i=1;i<=n;i++)
{
for(int j=2;j<=b[i]/j;j++)
{
while(!(b[i]%j))
{
if(mp[j])
{
puts("No");
return 0;
}
else b[i]/=j;
}
}
if(b[i]>1)
{
if(mp[b[i]])
{
puts("No");
return 0;
}
}
}
puts("Yes");
return 0;
}
文章讨论了三个编程问题:交换数列中的奇偶性操作、模拟攻击计算英雄伤害和判断数组安全牌的变化,以及利用质因数分解验证数组独立性。

被折叠的 条评论
为什么被折叠?



