这道题是一道简单模拟题,注意点在于可以叠加,也就是负数和偶数是两种情况。
#include
using namespace std;
char q[51];
double shu=0;
int main()
{
scanf("%s",q);
for(long long i=strlen(q)-1;i>=0;i--)
if(q[i]=='2') shu++;
if(q[0]=='-') shu=shu/(strlen(q)-1);
else shu/=strlen(q);
if(q[0]=='-') shu*=1.5;
if(!((q[strlen(q)-1]-'0')%2)) shu*=2;
printf("%.2lf%%\n",shu*100);
return 0;
}
这道题也是一道简单模拟题,注意点有三个,一个是0点到12点的端点时间不报时,第二个是Dang的数量按12小时算,第三个是整点情况,不能直接将小时加一。
#include
using namespace std;
long long a,b;
int main()
{
scanf("%lld:%lld",&a,&b);
if((a>=0&&a<=11)||(a==12&&!b)) printf("Only %02lld:%02lld. Too early to Dang.\n",a,b);
else
{
if(b) a++;
for(long long i=1;i<=a-12;i++) printf("Dang");
printf("\n");
}
return 0;
}
这个题不难,但是玩儿文字游戏,倒下的条件是超过酒量,也就是说酒量是1杯,他喝1杯不会倒,2杯才倒。
#include
using namespace std;
long long al,bl,k,ah,bh;
long long a,b,c,d;
bool dao=0;
int main()
{
scanf("%lld %lld %lld",&al,&bl,&k);
while(k--)
{
scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
if(dao) continue;
if(((b==(a+c))&&(d==(a+c)))||((b!=(a+c))&&(d!=(a+c)))) continue;
if(b==(a+c))
{
al--;
ah++;
if(al<0)
{
printf("A\n%lld\n",bh);
dao=1;
}
}
else
{
bl--;
bh++;
if(bl<0)
{
printf("B\n%lld\n",ah);
dao=1;
}
}
}
return 0;
}
这道题更偏向于数组模拟题,只要把朋友圈大于等于2的圈子里的所有人打上标记,代表不符合条件的人,然后在输出时,由于一个人只能输出一次,所以在输出一次后,也把他打上标记,最后还要判断一下是否有输出,没有输出过要输出一行No one is handsome
。
#include
using namespace std;
long long n,k;
bool v[100001],wu=1;
int main()
{
scanf("%lld",&k);
while(k--)
{
scanf("%lld",&n);
for(long long i=1;i<=n;i++)
{
long long a;
scanf("%lld",&a);
if(n-1) v[a]=1;
}
}
scanf("%lld",&k);
while(k--)
{
long long a;
scanf("%lld",&a);
if(!v[a])
{
if(!wu) printf(" ");
printf("%05lld",a);
v[a]=1;
wu=0;
}
}
if(wu) printf("No one is handsome\n");
else printf("\n");
return 0;
}
直接输出
#include
using namespace std;
int main()
{
printf("I'm gonna WIN!\nI'm gonna WIN!\nI'm gonna WIN!\n");
return 0;
}
简单模拟,判断奇数偶数。
#include
using namespace std;
long long n,a,b;
int main()
{
scanf("%lld",&n);
while(n--)
{
long long k;
scanf("%lld",&k);
if(k%2) a++;
else b++;
}
printf("%lld %lld\n",a,b);
return 0;
}
简单字符串,审题认真一点就行,一个点是忽略其他字符,第二个点是按顺序输出。
```cpp
#include
using namespace std;
long long ji[4];
char q[10001];
int main()
{
scanf("%s",q);
for(long long i=0;i
一道很简单的数学题,不用数学方法手动模拟也可以。
#include
using namespace std;
long long n;
int main()
{
scanf("%lld",&n);
printf("%lld\n",(n+1)%7+1);
return 0;
}
一道稍微有点儿复杂的sort排序题,把排序关系想清楚即可,记得自己发红包是要掏钱的,所以记得发红包的时候对应减去自己掏的钱,才是自己实际得到的钱。
#include
using namespace std;
long long n;
struct point
{
double shu;
long long id,ge;
}qian[10001];
bool operator<(const point a,const point b)
{
if(a.shu==b.shu)
{
if(a.ge==b.ge) return a.idb.ge;
}
return a.shu>b.shu;
}
int main()
{
scanf("%lld",&n);
for(long long i=1;i<=n;i++)
{
long long k;
scanf("%lld",&k);
while(k--)
{
long long a,b;
scanf("%lld %lld",&a,&b);
qian[a].shu+=b;
qian[a].ge++;
qian[i].shu-=b;
}
qian[i].id=i;
}
sort(qian+1,qian+1+n);
for(long long i=1;i<=n;i++) printf("%lld %.2lf\n",qian[i].id,qian[i].shu/100);
return 0;
}
这道题我最开始想用二维数组直接做,但实际由于里面关系过于复杂,二维数组很不好模拟出之间的关系,有一个点过不去,而这道题是一道很明显的并查集类题目,所以可以用并查集的方式将朋友放在一起,利用二维数组对仇人打标记,然后根据要求一句一句翻译成代码就好。
#include
using namespace std;
long long n,k,m,guan[101][101],par[101];
long long find(long long x)
{
return x==par[x]?x:par[x]=find(par[x]);
}
int main()
{
scanf("%lld %lld %lld",&n,&m,&k);
for(long long i=1;i<=n;i++) par[i]=i;
for(long long i=1;i<=m;i++)
{
long long a,b,c;
scanf("%lld %lld %lld",&a,&b,&c);
guan[a][b]=c;
guan[b][a]=c;
if(c!=-1&&find(a)!=find(b)) par[find(a)]=find(b);
}
while(k--)
{
long long a,b;
scanf("%lld %lld",&a,&b);
if(guan[a][b]!=-1&&find(a)!=find(b)) printf("OK\n");
else if(guan[a][b]!=-1&&find(a)==find(b)) printf("No problem\n");
else if(guan[a][b]==-1&&find(a)==find(b)) printf("OK but...\n");
else if(guan[a][b]==-1&&find(a)!=find(b)) printf("No way\n");
}
return 0;
}
这个题看起来很复杂,但实际上就是一道基础的二叉树的题,说是二叉树翻转,再层序遍历,但本质上就是每层从右往左依次输出,没什么特别难的,有一个坑,就是键值,是可以大于n的,经过实测,定为100是没有问题的。
#include
using namespace std;
long long n;
long long qian[100],zhong[100],ceng[100];
struct point
{
long long r,l;
}e[100];
void bian(long long qianr,long long qianl,long long zhongr,long long zhongl)
{
if(qianr>qianl) return;
e[qian[qianr]].r=0;
e[qian[qianr]].l=0;
long long wei;
for(wei=zhongr;;wei++)
if(zhong[wei]==qian[qianr]) break;
if(wei!=zhongr)
{
bian(qianr+1,qianr+wei-zhongr,zhongr,wei-1);
e[qian[qianr]].r=qian[qianr+1];
}
if(wei!=zhongl)
{
bian(qianr+wei-zhongr+1,qianl,wei+1,zhongl);
e[qian[qianr]].l=qian[qianr+wei-zhongr+1];
}
}
int main()
{
scanf("%lld",&n);
for(long long i=1;i<=n;i++) scanf("%lld",&zhong[i]);
for(long long i=1;i<=n;i++) scanf("%lld",&qian[i]);
bian(1,n,1,n);
long long head=0,tail=1;
ceng[1]=qian[1];
while(tail!=n)
{
head++;
if(e[ceng[head]].l) ceng[++tail]=e[ceng[head]].l;
if(e[ceng[head]].r) ceng[++tail]=e[ceng[head]].r;
}
for(long long i=1;i<=n;i++)
{
printf("%lld",ceng[i]);
if(i!=n) printf(" ");
else printf("\n");
}
return 0;
}
这道题是一道简单建立小根堆问题,但有一个复杂字符串处理比较麻烦,不过,抓住规律就会简单一些,写之前缕清思路就好。
#include
using namespace std;
long long n,m,shu[1001];
void pai(long long v)
{
while(v>1)
{
if(shu[v]
这套题总的而言不难,以考察基础知识为主,只要熟练掌握了每个部分的基础知识并平时练习到位了,稳住心态做这套题应该不会出什么问题。