Case #1:
123456789
Case #2:
Hello, welcome to my dream world!
Case #3:
Toodming is best
Case #4:
sokaisan
题解:
通过长度与k的关系来解密,自己模拟几遍就发现两者的关系了。
代码:
<span style="font-family:Menlo, Monaco, Consolas, Courier New, monospace;color:#333333;"><span style="font-size: 13px; line-height: 1.42857143; white-space: pre-wrap;">#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100000+100;
char s[maxn];
int main()
{
int t,ca=1;
scanf("%d",&t);
getchar();
while(t--)
{
gets(s);
int n=strlen(s);
int k;
scanf("%d",&k);
getchar();
int cur=n/k;
int cnt=n%k;
if(cnt!=0)
cur++;
else
cnt=k;
printf("Case #%d:\n",ca++);
for(int i=0;i<cur;i++)
{
for(int j=i,l=0;j<n;)
{
printf("%c",s[j]);
if(l<cnt)
j=j+cur;
else
j=j+cur-1;
l++;
if(i==(cur-1)&&l==cnt)
break;
}
}
printf("\n");
}
return 0;
}</span></span>
1003 IP聚合
Accepts: 2354
Submissions: 6308
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
题解:
map简单处理下就好了。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
#include <vector>
#include <map>
using namespace std;
const int maxn=1100;
int a[maxn];
int b[maxn];
int c[maxn];
int d[maxn];
map<long long,int> m;
int main()
{
int t;
scanf("%d",&t);
for(int te=1;te<=t;te++)
{
int N,M;
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++)
{
scanf("%d.%d.%d.%d",&a[i],&b[i],&c[i],&d[i]);
}
printf("Case #%d:\n",te);
int A,B,C,D;
int ans;
long long temp;
for(int i=1;i<=M;i++)
{
m.clear();
ans=0;
scanf("%d.%d.%d.%d",&A,&B,&C,&D);
for(int j=0;j<N;j++)
{
temp=0;
temp=temp*1000+(a[j]&A);
temp=temp*1000+(b[j]&B);
temp=temp*1000+(c[j]&C);
temp=temp*1000+(d[j]&D);
if(!m[temp])
{
ans++;
m[temp]=1;
}
}
printf("%d\n",ans);
}
}
return 0;
}
1004 放盘子
Accepts: 1130
Submissions: 2925
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
题解:
除了放不下一个盘子,其他都为小度熊胜,原因嘛,,,这个,,,是直觉
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const double pi=acos(-1.0);
int main()
{
int t,ca=1;
scanf("%d",&t);
while(t--)
{
int n;
double a, r;
scanf("%d%lf%lf",&n,&a,&r);
a=a/2*cos(pi/n)/sin(pi/n);
printf("Case #%d:\n",ca++);
if(a<r)
{
printf("I want to kiss you!\n");
}
else
{
printf("Give me a kiss!\n");
}
}
return 0;
}
1005下棋
Accepts: 345
Submissions: 2382
Time Limit: 6000/3000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
题解:
国王可以到的格子可以直接算出来,假如国王开始的位置是(x,y),则(i,j)位置最早在max(|x-i|,|y-j|),在此时刻后的任意时刻,它都可以到此位置,注意国王开始处的位置,在第2时刻才能到。想一下就可以理解,,,,骑士的需要bfs,并且可以记忆化,假如在第i时刻到达(x,y),假如国王在此时刻也可到达,答案就是i,还有国王不能到达的,假如相差的时刻为偶数,就可在国王到的时刻相遇,是奇数,可让国王晚到1个单位时间。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=1000+100;
const int inf=0x7fffffff;
int dir[8][2]= {{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
typedef struct node
{
int x;
int y;
} p;
int n,m,k;
int cnt[maxn][maxn];
int ans[maxn][maxn];
queue<p> q[2];
int bbs(int x)
{
if(x<0)
return -x;
return x;
}
int dfs()
{
int te=0;
int cur=inf;
p p1,p2;
memset(ans,-1,sizeof(ans));
for(int i=1; i<=k; i++)
{
while(!q[te].empty())
{
p1=q[te].front();
q[te].pop();
for(int j=0; j<8; j++)
{
p2.x=p1.x+dir[j][0];
p2.y=p1.y+dir[j][1];
if(p2.x>=1&&p2.x<=n&&p2.y>=1&&p2.y<=m)
{
if(ans[p2.x][p2.y]==-1)
{
if(cnt[p2.x][p2.y]<=i)
{
return i;
}
else
{
ans[p2.x][p2.y]=cnt[p2.x][p2.y];
if((cnt[p2.x][p2.y]-i)%2)
ans[p2.x][p2.y]++;
cur=min(cur,ans[p2.x][p2.y]);
q[!te].push(p2);
}
}
}
}
}
te=!te;
}
return cur;
}
int main()
{
int t,ca=1;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
p p1;
int x2,y2;
scanf("%d%d",&x2,&y2);
scanf("%d%d",&p1.x,&p1.y);
while(!q[0].empty())
q[0].pop();
q[0].push(p1);
while(!q[1].empty())
q[1].pop();
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(i==x2&&j==y2)
{
cnt[i][j]=2;
}
else
{
cnt[i][j]=max(bbs(i-x2),bbs(j-y2));
}
}
}
int ant=dfs();
printf("Case #%d:\n",ca++);
if(ant==inf||ant>k)
{
printf("OH,NO!\n");
}
else
{
printf("%d\n",ant);
}
}
return 0;
}
1006单调区间
Accepts: 358
Submissions: 938
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int t,n;
scanf("%d",&t);
for(int te =1;te<=t;te++)
{
scanf("%d",&n);
double ans1=1+((n-2)*19)*1.0/27.0;
double ans2=(46-38.0/n)*1.0/((19-11.0/n)*1.0);
printf("Case #%d:\n",te);
printf("%.6f %.6f\n",ans1,ans2);
}
return 0;
}