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()函数排序并非最优解。