T1煤球数目
#include<bits/stdc++.h>
using namespace std;
//奇数:三边相等 a + (a-1) + (a-2)
//偶数:下边多一个 a + (a-1) + (a-1)
//错误,不要主观臆断,要从已知的条件找
//正确答案:an = an-1 + n
int ans = 1;
int t = 1;
int main()
{
for(int i=2; i<=100; i++)
{
ans = ans + i;
t = t + ans;
}
printf("%d\n", t);
return 0;
}
T2生日蜡烛
#include<bits/stdc++.h>
using namespace std;
//看到这个题目还以为跟日期相关
/*那就复习下:
每年2月28日,
当润年时就29,其他的月份都是大月31,小月30
润年怎么求?
1、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年)
2、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
3、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。*/
//没事要记得复习怎么用Excel解题呀!!!
//回到这个题目:
//思路:就是问 x + (x+1) + (x+2) + ... +(x+n) = 326 中 x的值。
int ans = 0;
int main()
{
for(int x=1; x<=236; x++)
{
int t = x;
ans = 0;
while(ans<=300)
{
ans = ans + (t++);
if(ans == 236)
{
cout << x;
return 0;
}
}
}
T3凑算式
感觉失误的地方是没用到double,
因为有的不能整除答案就会出现误差
#include<bits/stdc++.h>
using namespace std;
int arr[9] = {1,2,3,4,5,6,7,8,9};
int ans = 0;
bool f(int arr[])
{
double t = (double)arr[0] + (double)arr[1]/(double)arr[2] + ((double)arr[3]*100 + (double)arr[4]*10 + (double)arr[5])/((double)arr[6]*100 + (double)arr[7]*10 + (double)arr[8]);
if(t == 10.0) return true;
else return false;
}
int main()
{
do
{
if(f(arr)) ans++;
//printf("%d\n", f(arr));
//printf("%d %d %d %d %d %d %d %d %d\n", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8]);
}while(next_permutation(arr, arr+9));
cout << ans;
return 0;
}
T4快速排序(还是没做出来…)
#include <stdio.h>
void swap(int a[], int i, int j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
int partition(int a[], int p, int r)
{
int i = p; //p为一开始前界限的下标
int j = r + 1;//j为后界限的下标
int x = a[p];//把第一个数字作为中间轴
while(1)
{
while(i<r && a[++i]<x);//找比第一个数大的数字,停在那里
while(a[--j]>x);//找一个比第一个数小的数字,并停在那里
if(i>=j) break;
swap(a,i,j);
}
swap(a,p,j); //因为是拿 第一个数作为中间轴,偷偷的把中间轴换成右边的更小的数字
return j;
}
void quicksort(int a[], int p, int r)
{
if(p<r){
int q = partition(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}
int main()
{
int i;
int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
int N = 12;
quicksort(a, 0, N-1);
for(i=0; i<N; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}
T5抽签
#include <stdio.h>
#define N 6 //国家数
#define M 5 //可以去的人数
#define BUF 1024
//那么最终派往W星的观察团会有多少种国别的不同组合呢?6个国家, 5个人
// 0 5可以去的人数m
void f(int a[], int k, int m, char b[])
{ //DFS!!!!!!!!!
int i,j;
if(k==N) //边界
{
b[M] = 0;
if(m==0) printf("%s\n",b); //输出方案
return; //回溯
}
for(i=0; i<=a[k]; i++)//选国家
{
for(j=0; j<i; j++) b[M-m+j] = k+'A'; //该国家去的人数 字母存入输出数组
f(a, k+1, m-j, b); //填空位置
}
}
int main()
{
int a[N] = {4,2,2,1,1,3}; //每个国家可以派出的最多的名额的数组
char b[BUF]; //储存方案的字符型数组
f(a,0,M,b);
return 0;
}
T7剪邮票
有时候记得模板是好的,但是要灵活点去思考适不适合
这里我要是遍历他们是否连接在一起也只能一条路走,
要是走进子胡同我们而且把来的路堵上了就通过不了了
还有我要回溯没用啊,只是证明1是不是连在一起,
又不是看连接在一起的1组成的迷宫有几种走法。。
#include <bits/stdc++.h>
using namespace std;
//有多少种不同的剪法?
//思路:用dfs去走路
//落脚点怎么取?
int movea[2][4] = { {1,0,-1,0}, {0,1,0,-1} };
int ans = 0;
int a[12] = {0,0,0,0,0,0,0,1,1,1,1,1}; //全排列这个数组,用dfs看排列后的1是否相连
int mapa[3][4];
bool pd()
{
for(int i=0; i<=2; i++)
for(int j=0; j<=3; j++)
{
if(mapa[i][j] == 1) return false;
}
return true;
}
void dfs(int x, int y)
{
//一个一个的遍历似乎不行,要一次向四周移动,后在判断还是否存在0
if(x<0 || y<0 || x>2 || y>3) return;
if(mapa[x][y] == 0) return;
mapa[x][y] = 0;
dfs(x, y+1);
dfs(x+1, y);
dfs(x, y-1);
dfs(x-1, y);
}
int main()
{
do
{
int t=0;
for(int x=0; x<=2; x++) //把这个填入map数组中
{
for(int y=0; y<=3; y++)
{
mapa[x][y] = a[t++];
// printf("%d ", mapa[x][y]);
}
}
int q, p;
for(int x=0; x<=2; x++)
for(int y=0; y<=3; y++)
if(mapa[x][y] == 1){q = x, p = y, x=3, y=4;}
// printf("%d %d %d %d %d %d %d %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]);
dfs(q, p);
if(pd()) ans++;
}while(next_permutation(a, a+12));
printf("%d", ans);
return 0;
}