这次算做CF以来除了第一次以外最顺的一次吧,做了3个题,总算回到蓝名了
A题:
将1~n^2的数分为n组,使得每组的和相同。
思路:
1、每n位选一个数,每次进行一个偏移操作,即每n位的不同位置选择一个数
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=101;
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
int sum=(1+n*n)*n/2;
for(int i=1;i<=n;i++)
{
int res=i-1;
for(int j=1;j<n;j++)
{
printf("%d ",(j-1)*n+res+1);
res=(res+1)%n;
}
printf("%d\n",(n-1)*n+res+1);
}
}
return 0;
}
B题:
判断8个点是否组成的图形为一个矩形的4个点加4边的中点。
排序后直接判断即可~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int x;
int y;
bool operator <(const node &a)const
{
if(x==a.x)
return y<a.y;
return x<a.x;
}
}p[8];
int main()
{
for(int i=0;i<8;i++)
scanf("%d%d",&p[i].x,&p[i].y);
sort(p,p+8);
if(p[0].x==p[1].x&&p[1].x==p[2].x&&p[3].x==p[4].x&&p[5].x==p[6].x&&p[6].x==p[7].x&&
p[0].y==p[3].y&&p[3].y==p[5].y&&p[1].y==p[6].y&&p[2].y==p[4].y&&p[4].y==p[7].y
&&p[0].x!=p[3].x&&p[3].x!=p[5].x&&p[0].y!=p[1].y&&p[1].y!=p[2].y)
printf("respectable\n");
else
printf("ugly\n");
return 0;
}
C题:
题意比较坑,读了半天也没读懂,后来才慢慢想懂,这个题就是给你一个钱,让你用题目所给的硬币面额(3的倍数)去组合成比n值大的数,要求求出最小值的最大值。
其实想想也就理解了,如果不求最小值的最大值,那么所有答案都会是1,最小值的最大值也就是说比如4,你可以用大于9个面额1个去换,但是要求求最小值的最大值,那么我们可以知道用面额为3的话需要2个就够了
剩下的其实就不难了,直接找到第一个除不尽的面额,然后除它就是答案了
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
long long n;
int main()
{
while(scanf("%I64d",&n)!=EOF)
{
long long ans=0,pos=3;
while(1)
{
if(n%pos!=0)
{
ans=n/pos+1;
break;
}
pos*=3;
}
printf("%I64d\n",ans);
}
return 0;
}