前言
发表人生中第一个技术博客,还请各位大佬指教 因为昨天帮家里人装家具没看到比赛信息,后来匆匆忙忙比赛就只写了第一题,然后要来补题,诶~~~ 本次比赛在vjudge上进行,每周五晚会进行比赛,没写出来的题要补,(其实听题解的时候我都还没看题[破涕为笑]) 希望未来的某一天,我能拥有自己的服务器,挂着自己搭建的博客…
话不多说,进入正题
Far Relative’s Problem CodeForces - 629B
开了两个大小为666的数组(大一点防越界)代表一年间男女可以来聚会的人数,输入男(女)之后在代表男(女)数组里面+1,代表那一天有多少男(女)可以聚会. 由于是一对一对的,最后遍历的时候男女的人数取小,代码中是 min( f [ i ] , m [ i ] ) 从0开始依次比较
#include<stdio.h>
int min(int a,int b)
{
if(a<b){
return a;
}
else{
return b;
}
}
int main()
{
int i,a,b,t,k,j;
int f[666],m[666];
char r;
while(~scanf("%d",&t))
{
getchar();//吃掉回车
for(i=0;i<666;i++){//初始化
f[i]=0;m[i]=0;
}
for(i=0;i<t;i++){
scanf("%c %d %d",&r,&a,&b);
//在m和f数组里加
if(r=='M'){
for(j=a;j<=b;j++){
m[j]++;
}
}
else if(r=='F'){
for(j=a;j<=b;j++){
f[j]++;
}
}
getchar();
}
k=min(f[0],m[0]);
for(i=1;i<666;i++){
if(min(f[i],m[i])>k){由于是一对,所以取小
k=min(f[i],m[i]);
}
}
printf("%d\n",k*2);
}
}
Joysticks CodeForces - 651A
把输入的两个数比较大小,大的那个-2,小的那个+1,无限循环直到有一个<=0, 注意一下判断a<1||b<1||a==1&&b==1判断的条件要在a-=2;b++;前面 代码如下
#include<stdio.h>
int main()
{
int i,j,k,a,b,t;
while(~scanf("%d %d",&a,&b))
{
t=0;
while(1)
{
if(a<1||b<1||a==1&&b==1){//注意a==1&&b==1这个条件
break;
}
if(a>b);//确保a是大的
else{
int swap = a;
a = b;
b = swap;
}
a-=2;b++;t++;
}
printf("%d\n",t);
}
return 0;
}
Beautiful Paintings CodeForces - 651B
这个题嘛,我也想了蛮久的,看了别人的还有点看不懂,我原本也想怎么把数组分开,后来就发现不需要这样,我说一下我的思路吧 输入的数范围在1000以内,然后开一个范围超过1000的数组来存,输入的数当做数组的下标,每输入一次那个数,那么代表那个数的数量的变量to[i]就+1,最后来几次遍历,to数组里只要还有没减去的数,就继续循环,直到数组里所有数组的数全部为0
#include<stdio.h>
int to[1005];
int main()
{
int i,m,t,data;
scanf("%d",&t);
data=0;
for(i=0;i<t;i++){
scanf("%d",&m);
to[m]++;
}
while(1)
{
int cut=0;
for(i=0;i<1002;i++){
if(to[i]>=1){
to[i]--;
cut++;//代表数量,像5 4 3 2 1,有五个数,但是在下面data相加的时候要-1
}
}
if(cut==0){
break;
}
data+=cut-1;
}
printf("%d\n",data);
}
}
鉴于本人代码能力有限,可能会有更好的算法,若有错误,还请各位指教