NYIST 練習 題解(二)
阿新 • • 發佈:2018-12-10
CTF 皮皮蝦 所寫題解
想了解CTF的同學可以進群瞭解 (只限本校17級的新生) 811409334
接著上一篇寫
J 猴子吃桃問題
這個其實很簡單的 只要逆推就行了 他這個是吃掉一半多一個 那麼剩下的+1 就是一半 那麼就可以寫出程式碼
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; int main() { int t,n,ans; scanf("%d",&t); while(t--) { ans=1; scanf("%d",&n); for(int i=0;i<n;i++) { ans=(ans+1)*2; } printf("%d\n",ans); } return 0; }
K 正三角形的外接圓面積
這個需要高中知識 三角形邊長/(根號3)=外接圓半徑 sqrt 這個函式就是開方的 注意精度 .2是控制精度的 就是小數點後兩位
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; #define pi 3.1415926 int main() { int n; double m; double r; scanf("%d",&n); while(n--) { scanf("%lf",&m); r=m/sqrt(3.0); printf("%.2lf\n",r*r*pi); } return 0; }
L 兩點距離
這個知道k 這個就很簡單了
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; #define pi 3.1415926 int main() { int n; double x,y,xx,yy; scanf("%d",&n); while(n--) { scanf("%lf%lf%lf%lf",&x,&y,&xx,&yy); printf("%.2lf\n",sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy))); } return 0; }
M 開燈問題
這個上一年我暴力就心態崩了 其實可以用bool 還有! bool 只有 0 1 那麼可以用它來表示開燈關燈的狀態 !是0變1 1變0 可以模仿開燈關燈
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define pi 3.1415926
bool d[1200];
int main()
{
memset(d,0,sizeof(d));
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(j%i==0)
d[j]=!d[j];
}
}
for(int i=1;i<=n;i++)
{
if(d[i])
printf("%d ",i);
}
printf("\n");
return 0;
}
N 字串替換
這個就是gets 和scanf的用法 scanf 是遇見空格或者換行都停止輸入 而gets是遇見換行才會停止輸入(但是gets會造成輸入溢位 會讓惡意的shellcode 獲得程式控制權 gets是個危險函式!)
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define pi 3.1415926
char d[1200];
int main()
{
int len;
while(gets(d))
{
len=strlen(d);
for(int i=0;i<len;i++)
{
if(d[i]=='y'&&d[i+1]=='o'&&d[i+2]=='u')
{
printf("we");
i+=2;
continue;
}
printf("%c",d[i]);
}
printf("\n");
}
return 0;
}
O 房間安排
這個是 只要找到時間區段中最大房間用量就行
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define pi 3.1415926
int d[11200];
int main()
{
int t,n,a,b,c,maxx;
scanf("%d",&t);
while(t--)
{
memset(d,0,sizeof(d));
maxx=0;
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d",&a,&b,&c);
for(int i=b;i<b+c;i++)
d[i]+=a;
}
for(int i=0;i<11000;i++)
{
if(d[i]>maxx)
maxx=d[i];
}
printf("%d\n",maxx);
}
return 0;
}
P 素數
這個在上面的基礎上 兩邊開始找素數就行 注意兩邊相同的時候 要大的
#include<stdio.h>
#include<string.h>
bool ppx[1500];
void init()
{
memset(ppx,0,sizeof(ppx));
ppx[0]=ppx[1]=1;
for(int i=2; i<675; i++)
{
if(ppx[i])
continue;
for(int j=i*i; j<1500; j+=i)
{
ppx[j]=1;
}
}
}
int main()
{
init();
int n,m;
scanf("%d",&n);
while(n--)
{
int i=0;
int x=0x7f7f7f7f,xx=0x7f7f7f7f;
scanf("%d",&m);
if(!ppx[m])
printf("%d\n",m);
else
{
while(1)
{
i++;
if(!ppx[m+i])
{
printf("%d\n",m+i);
break;
}
if(m-i>=0&&!ppx[m-i])
{
printf("%d\n",m-i);
break;
}
}
}
}
}
Q 斐波那契數列
這個 注意2^64 那麼只能用無符號的(因為這裡沒有負數) 有符號 2^63 無符號2^64
#include<stdio.h>
#include<string.h>
unsigned long long int p[1000];
void init()
{
p[1]=1;
p[2]=1;
for(int i=3;i<=93;i++)
{
p[i]=p[i-1]+p[i-2];
}
}
int main()
{
init();
unsigned long long int n;
bool flag;
while(~scanf("%llu",&n))
{
flag=0;
if(n==0)
break;
for(int i=1;i<=93;i++)
{
if(p[i]==n)
flag=1;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
R 畫圖
這個太水了把。。。。(暗示大風車)
#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("*");
printf("\n");
}
return 0;
}
S 九九乘法表
觀察一下 樣例的輸入輸出 跟著模擬就行了 注意格式!
#include<stdio.h>
int main()
{
int t;
int n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=i;j<=9;j++)
{
printf("%d*%d=%d ",i,j,i*j);
}
printf("\n");
}
printf("\n");
}
return 0;
}