A打表找规律
先输入打表找规律
//输入一个n,找到3个数x,y,z使得x+y+z=n,可以整除n,以及xyz最大,且输出xyz
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e6+5;
int maxx=-1;
void solve(int n){
for(int x=1;x<=n;x++){
for(int y=1;y<=n;y++){
int z=n-x-y;
if(z<=0)break;
if(n%x==0&&n%y==0&&n%z==0){
int zz=x*y*z;
maxx=max(maxx,zz);
}
}
}
printf("%4d ",maxx);
if(n%10==0)putchar('\n');
}
int main(){
// int t;
// scanf("%d",&t);
// while(t--){
int n;
scanf("%d",&n);
int flag=1;
for(int i=1;i<=n;i++){
maxx=-1;
solve(i);
}
// }
return 0;
}
/*
20
-1 -1 1 2 -1 8 -1 16 27 -1
-1 64 -1 -1 125 128 -1 216 -1 250
3的倍数
3 1
6 8
9 27
12 64
15 125
18 216
4的倍数
4 2
8 16
12 64
16 128
20 250
*/
提交代码
#include <iostream>
#include <cstdio>
#include <cmath>
#define ll long long
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
ll n;
scanf("%lld",&n);
if(n%3==0){
printf("%lld\n",n*n*n/27);
}else if(n%4==0){
printf("%lld\n",n*n*n/32);
}else{
printf("-1\n" );
}
}
return 0;
}
C几何的简单实现
构成n个不想交的三角形
先排序,然后最近的三个点进行连接,形成三角形
排序方式:先对x排序,从小到大,如果x相同,就对y排序,y从小到大
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e3+5;
struct Point{
int x,y;
int z;
Point(int x=0,int y=0):x(x),y(y){}
}point[maxn*3];
bool cmp(Point& a,Point &b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=3*n;i++){
int x,y;
scanf("%d%d",&x,&y);
point[i].x=x,point[i].y=y;
point[i].z=i;
}
sort(point+1,point+1+3*n,cmp);
for(int i=1;i<=3*n;i++){
if(i%3==1)printf("%d",point[i].z);
else printf(" %d",point[i].z);
if(i%3==0)putchar('\n');
}
}
return 0;
}
G打表找规律-略难找
看见数是\(10^{18}\)就知道一定是找规律的数学题
然后就开始打表找规律
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=1e5+5;
const int MOD=1e9+7;
int a[maxn];
void init(){
a[1]=1,a[2]=1;
for(int i=3;i<maxn;i++){
a[i]=a[i-a[i-1]]+a[i-1-a[i-2]];
}
}
int main(){
init();
// for(int i=1;i<maxn;i++){
// a[i]+=a[i-1];
// a[i]%=MOD;
// }
for(int i=1;i<=40;i++){
printf("%3d ",a[i]);
if(i%10==0)putchar('\n');
}
return 0;
}
/*
打表发现
1 1 2 2 3 4 4 4 5 6
6 7 8 8 8 8 9 10 10 11
12 12 12 13 14 14 15 16 16 16
16 16 17 18 18 19 20 20 20 21
除了第一个数字
1,3,5,7,9...出现1次
2,6,10,14,18...出现2次
4,12,20,28,36...出现3次
8,24,40,56,72...出现4次
x出现的次数为2进制形式最后一个1在从右往左数第几位
*/
提交代码
待补
K模拟时间转换
恶心在60min对h的进1转换
前面补0
字符串输入,而且输入还有1个字符的数字和2个字符的数字
同时还要注意北京时间是东八区时间(高中学地理的就是爽)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a,b;
char s[10];
void change(int &a,int &b,int t1,int t2){
a=a-8+t1;
b=b+t2*6;
if(b>=60){b-=60;a++;}
if(b<0){b+=60;a--;}
if(a>=24)a-=24;
if(a<0)a+=24;
}
void gettime(int &t1,int &t2){
int len=strlen(s);
int i;
for(i=4;i<len;i++){
if(s[i]=='.')break;
if(s[i]>='0'&&s[i]<='9'){
t1=t1*10+s[i]-'0';
}
}
for(;i<len;i++){
if(s[i]>='0'&&s[i]<='9'){
t2=t2*10+s[i]-'0';
}
}
if(s[3]=='-'){t1=-t1;t2=-t2;}
}
int main(){
int n;
scanf("%d",&n);
while(n--){
scanf("%d %d %s",&a,&b,s);
int t1=0,t2=0;
gettime(t1,t2);
change(a,b,t1,t2);
printf("%02d:%02d\n",a,b);
}
return 0;
}