3.19(Virtual Judge)

A.P2669 [NOIP2015 普及组] 金币

这道题我的想法就是用一个c去标记每天增加的金币,用一个双层循环来做,外层循环每循环一次则c++,内层循环则是表示每一个c要用多少天。

#include<stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	int c=0;
	int s=0;
	int k=0;
	for(;;)
	{
		c++;
		for(int i=0;i<c;i++)
		{
			s+=c;
			k++;
			if(k==n)
				goto end;
		}
	}
	end:
	printf("%d", s);	
	return 0;
}

B.P5660 [CSP-J2019] 数字游戏

这道题我的想法就是用一个字符串去读取数据,然后遍历其中元素,看是否有''1'的存在,有则k++。

#include<stdio.h>
#include<string.h>
int main()
{
	char s[11];
	scanf("%s", s);
	int l=strlen(s);
	int k=0;
	for(int i=0;i<l;i++)
	{
		if(s[i]=='1')
			k++;
	}
	printf("%d", k);
	return 0;
}

C.P5015 [NOIP2018 普及组] 标题统计

这道题我的想法就是去找到空格和换行的个数,然后用总个数减去这个个数。

不过有意识的一个点就是我把换行的'\n'打成了制表符'\t',不过还是过了,我想应该是由于我用的是gets(),行末的'\n'自动被抹去了,再加之strlen()不会把'\n'算入其中,所以巧合的就过了。

(果然,我把||s[i]=='\t'删去之后依然过了)

#include<stdio.h>
#include<string.h>
int main()
{
	char s[11];
	gets(s);
	int l=strlen(s);
	int k=0;
	for(int i=0;i<l;i++)
	{
		if(s[i]==' '||s[i]=='\t')
		{
			k++;
		}
	}
	printf("%d", l-k);
	return 0;
}

D.P5681 [CSP-J2019 江西] 面积

这道题的话,卡了很久,一直没能ac。刚开始的代码是这样的:

#include<stdio.h>
#include<string.h>
int main()
{
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);
	unsigned long long s1, s2;
	s1=a*a;
	s2=b*c;
	if(s1>s2)
		printf("Alice");
	if(s1<s2)
		printf("Bob");
	return 0;
}

后面把s1和s2那两步去掉后就过了,也不知道是为什么T_T 。

#include<stdio.h>
int main()
{
	unsigned long long a, b, c;
	scanf("%llu%llu%llu", &a, &b, &c);
	if(a*a>b*c)
		printf("Alice");
	else
	{
		printf("Bob");
	}
	return 0;
}

E.P1190 [NOIP2010 普及组] 接水问题

这道题之前在牛客上做到过,就很轻松的写玩=完了,几乎没什么阻力。(这就是多写题的乐趣吗?嘿/-嘿\-)

它的思路就是每次都对m个k数组进行减一,如果此时k[i]变为了0,则用第m+1个来替换k[i],每循环一次,计时的c++。如此循环,当最后一个人接到水时,停止循环,然后,找到最后这一批人中接水所需时间最长的,把它加进c中即可。

#include<stdio.h>
#include<algorithm>
int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	int k[n];
	for(int i=0;i<n;i++)
	{
		scanf("%d", &k[i]);
	}
	int c=0;
	int xm=m;
	for(;xm<n;)
	{
		for(int i=0;i<m;i++)
		{
			k[i]--;
			if(k[i]==0&&xm<n)
			{
				k[i]=k[xm];
				xm++;
			}
		}
		c++;
	}
		int maxx=-1;
		for(int i=0;i<m;i++)
		{
			maxx=std::max(maxx, k[i]);
		}
	printf("%d", c+maxx);
	return 0;
}

F.P7071 [CSP-J2020] 优秀的拆分

这道题我的想法就是先用一个数组a把所有小于n的2的?次方的数记录下来。然后用一个循环,从数组a的最后一个数开始找起,只要当前的a[i]小于等于当前的n,则把这给a[i]计入数组b中,并把n减去一个a[i]。

#include<stdio.h>
#include<math.h>
int main()
{
	int n;
	scanf("%d", &n);
	int a[10000];
	int i=0;
	for(;;i++)
	{
		int s=pow(2, i+1);
		if(s>n)
			break;
		else
			a[i]=s;
	}
	int c=0;
	int b[10000];
	int k=0;
	for(int j=i-1;j>=0;j--)
	{
		if(a[j]<n)
		{
			b[c]=a[j];
			n=n-a[j];
			c++;
		}
		if(a[j]==n)
		{
			b[c]=a[j];
			c++;
			k=1;
			break;
		}
		if(a[j]>n)
		{
			continue;
		}
	}
	if(k==0)
		printf("-1");
	else
	{
		for(int j=0;j<c;j++)
		{
			printf("%d ", b[j]);
		}
	}
	
	return 0;
}

G.P2670 [NOIP2015 普及组] 扫雷游戏

这道题就是先把整个图像用char数组记录,然后遍历这个数组:当当前字符为'*'时,直接输出'*',否则去遍历当前字符四周的字符,如果有'*',则计数的v++,遍历结束后输出v,如此循环即可。

#include<stdio.h>
int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	char a[n+2][m+2];
	getchar();
	for(int i=1;i<=n;i++)
	{
		
		for(int j=1;j<=m;j++)
		{
			scanf("%c", &a[i][j]);
		}
		getchar();
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			
			if(a[i][j]=='*')
				printf("*");
			else
			{
				int v=0;
				for(int o=i-1;o<=i+1;o++)
				{
					for(int p=j-1;p<=j+1;p++)
					{
						if(a[o][p]=='*')
							v++;
					}
				}
				printf("%d", v);
			}
		}
		printf("\n");
	}
	return 0;
}

H.P1098 [NOIP2007 提高组] 字符串的展开

这道题虽然题目比较长,看起来比较难,其实就那样,只要跟着题目一步步写就行。

唯一需要注意的是,当p1==2时,即要求输出大写的对应字符时,如果当前的字符是数字,则直接输出数字。

#include<stdio.h>
#include<string.h>
int main()
{
	int p1, p2, p3;
	scanf("%d%d%d", &p1, &p2, &p3);
	char a[110];
	scanf("%s", a);
	int l=strlen(a);
	printf("%c", a[0]);
	for(int i=1;i<l-1;i++)
	{
		if(a[i]!='-')
		{
			printf("%c", a[i]);
		}
		else
		{
			if(((a[i-1]>='a'&&a[i-1]<='z')&&(a[i+1]>='a'&&a[i+1]<='z'))||((a[i-1]>='0'&&a[i-1]<='9')&&(a[i+1]>='0'&&a[i+1]<='9')))
			{
				int kv=a[i+1]-a[i-1];
				if(kv<1)
					printf("%c", a[i]);
				//else if(a[i+1]-a[i-1]==1)什么都不干
				else if(kv>1)
				{
					if(p3==1)
					{
						if(p1==1)
						{
							for(int x=1;x<kv;x++)
							{
								for(int y=0;y<p2;y++)
								{
									printf("%c", a[i-1]+x);
								}
							}
						}
						if(p1==2)
						{
							if((a[i-1]>='a'&&a[i-1]<='z')&&(a[i+1]>='a'&&a[i+1]<='z'))
							{
								int kvv='a'-'A';
								for(int x=1;x<kv;x++)
								{
									for(int y=0;y<p2;y++)
									{
										printf("%c", a[i-1]+x-kvv);
									}
								}
							}
							else
							{
								for(int x=1;x<kv;x++)
								{
									for(int y=0;y<p2;y++)
									{
										printf("%c", a[i-1]+x);
									}
								}
							}
						}
						if(p1==3)
						{
							for(int x=1;x<kv;x++)
							{
								for(int y=0;y<p2;y++)
								{
									printf("*");
								}
							}
						}
					}
					else if(p3==2)
					{
						if(p1==1)
						{
							for(int x=kv-1;x>=1;x--)
							{
								for(int y=0;y<p2;y++)
								{
									printf("%c", a[i-1]+x);
								}
							}
						}
						if(p1==2)
						{
							if((a[i-1]>='a'&&a[i-1]<='z')&&(a[i+1]>='a'&&a[i+1]<='z'))
							{
								int kvv='a'-'A';
								for(int x=kv-1;x>=1;x--)
								{
									for(int y=0;y<p2;y++)
									{
										printf("%c", a[i-1]+x-kvv);
									}
								}
							}
							else
							{
								for(int x=kv-1;x>=1;x--)
								{
									for(int y=0;y<p2;y++)
									{
										printf("%c", a[i-1]+x);
									}
								}
							}
						}
						if(p1==3)
						{
							for(int x=kv-1;x>=1;x--)
							{
								for(int y=0;y<p2;y++)
								{
									printf("*");
								}
							}
						}
					}
				}
			}
			else
			{
				printf("%c", a[i]);
			}
		}
	}
	printf("%c", a[l-1]);
	
	
	return 0;
}

J.P1309 [NOIP2011 普及组] 瑞士轮

这道题的话,之前在牛客上做过它的easy版。其ac代码如下:

#include<stdio.h>
#include<algorithm>
struct nuu
{
	int bianhao;
	int jifen;
	int shili;
	bool operator<(const nuu & tmp)const
	{
		return jifen>tmp.jifen||(jifen==tmp.jifen&&bianhao<tmp.bianhao);
	}
};
int main()
{
	int n, r, q;
	scanf("%d%d%d", &n, &r, &q);
	nuu a[2*n];
	for(int i=0;i<2*n;i++)
	{
		scanf("%d", &a[i].jifen);
		a[i].bianhao=i+1;
	}
	for(int i=0;i<2*n;i++)
	{
		scanf("%d", &a[i].shili);
	}
	std::sort(a, a+(2*n));
	for(int i=0;i<r;i++)
	{
		for(int j=1;j<2*n;j+=2)
		{
			if(a[j].shili>a[j-1].shili)
				a[j].jifen++;
			else
				a[j-1].jifen++;
		}
		std::sort(a, a+(2*n));
	}
	printf("%d\n", a[q-1].bianhao);
	return 0;
}

把这段代码提交到这道题的话只能过90%,最后一个示例会超时。其原因在于多次的sort()函数排序,而对于此题,sort()函数排序并非最优解。

K.P2058 [NOIP2016 普及组] 海港

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值