A题:组队
答案:490
数据:
1 97 90 0 0 0
2 92 85 96 0 0
3 0 0 0 0 93
4 0 0 0 80 86
5 89 83 97 0 0
6 82 86 0 0 0
7 0 0 0 87 90
8 0 97 96 0 0
9 0 0 89 0 0
10 95 99 0 0 0
11 0 0 96 97 0
12 0 0 0 93 98
13 94 91 0 0 0
14 0 83 87 0 0
15 0 0 98 97 98
16 0 0 0 93 86
17 98 83 99 98 81
18 93 87 92 96 98
19 0 0 0 89 92
20 0 99 96 95 81
代码:
#include
#include
#include
#include
#include
using namespace std;
int a[25],b[25],c[25],d[25],e[25];
int main(){
int i,j,k,t,f,h;
for(int i=0;i<20;i++){
cin>>h;
cin>>a[i]>>b[i]>>c[i]>>d[i]>>e[i];
}
int sum=-1;
for(i=0;i<20;i++){
for(j=0;j<20;j++){
for(k=0;k<20;k++){
for(t=0;t<20;t++){
for(f=0;f<20;f++){
if(i!=j&&i!=k&&i!=t&&i!=f&&j!=k&&j!=t&&j!=f&&k!=t&&k!=f&&t!=f){
int num=a[i]+b[j]+c[k]+d[t]+e[f];
sum=max(sum,num);
}
}
}
}
}
}
cout<
第二题:
答案:BYQ
2019=26*26*2+26*25+17;
第三题:
答案:4659
代码:
#include
#include
#include
#include
#include
using namespace std;
int main(){
long long a=1,b=1,c=1,h=0;
for(int i=4;i<=20190324;i++){
h=(a+b+c)%10000;
a=b;b=c;c=h;
}
cout<
第四题:
答案:40785
#include
#include
#include
#include
#include
using namespace std;
int judge(int x){
while(x){
int t=x%10;
x/=10;
if(t==2||t==4){
return 0;
}
}
return 1;
}
int main(){
int a,b,c,num=0,x;
for(a=1;a<2019;a++){
for(b=a+1;b<2019;b++){
c=2019-a-b;
if(c
第五题:迷宫
答案:186步
DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR
注意:
输入数据不能用int mp[50][50]表示,因为输入的‘0’与'1'没有空格
定义结构体数组:结构体内部不能存在函数!!!!!
direction dir[4]={{1,0,'D'},{0,-1,'L'},{0,1,'R'},{-1,0,'U'}};
注意方向的表示,非常容易错误:int dir[4][2] ={{-1,0},{1,0},{0,-1},{0,1}}; //上下左右
{-1,0}表示行往上一个单位,列不变 ----方向:上
{0,-1}表示列减少一个单位,行不变 ----方向:左
#include
using namespace std;
int n,m;
struct node{
int x,y,step;
string s;
node(int xx,int yy,int step1,string ss){
x=xx;
y = yy;
step = step1;
s = ss;
}
};
struct direction{
int x,y;
char c;
};
char mp[55][55];
int vis[55][55];
struct direction dir[4]={{1,0,'D'},{0,-1,'L'},{0,1,'R'},{-1,0,'U'}};
void bfs(int a,int b){
queue q;
memset(vis,0,sizeof(vis));
q.push(node(a,b,0,""));
vis[a][b]=1;
while(!q.empty()){
node fr=q.front();
q.pop();
for(int i=0;i<4;i++){
int x=fr.x+dir[i].x;
int y=fr.y+dir[i].y;
if(x>=0&&x=0&&y>mp[i][j];
}
bfs(0,0);
return 0;
}
F: 特别数的和
#include
using namespace std;
int n;
long long num;
//包含0,1,2,9
int solve(int x){
while(x){
int t=x%10;
x/=10;
if(t==0||t==1||t==2||t==9) return 1;
}
return 0;
}
int main(){
cin>>n;
num=0;
for(int i=1;i<=n;i++){
if(solve(i)) num+=i;
}
cout<
G:完全二叉树的权值
#include
using namespace std;
int N;//100000
long long ans[20];//深度最多为20---记录每层值的总和
#define inf 0x7f7f7f7f
int main(){
cin>>N;
//每层的深度
for(int i=0;i<=20;i++) ans[i]=0;
int d=1,t;
for(int i=1;i<=N;i++){
cin>>t;
if(i>=pow(2,d)){
d++;//表示进入下一个深度
}
ans[d]+=t;
}
//cout<
H: 等差数列
我的垃圾思路:求出数列的最小间距d_min,d_min与等差间距d一定存在d*k=d_min之间的关系。
由于我们要使项数最小,所以我们要使k尽量小,所以我们遍历k从1到d_min
另外我们需要特判当d=0的情况,项数为N
更优的思路:
排序,然后对两个数的距离进行求最大公因子。
思路一代码:
#include
using namespace std;
#define maxn 100010
#define inf 0x7f7f7f7f
int a[maxn],N,d_min;
int solve(int k){//判断d是否符合数组的d
int d=d_min/k;
for(int i=0;i>N;
for(int i=0;i>a[i];
sort(a,a+N);
//等差数列的d与最小间距d_min的关系:d*k=d_min
d_min=inf;//求出两数间距的最小值
for(int i=0;i
思路二代码:
#include
using namespace std;
#define maxn 100010
#define inf 0x7f7f7f7f
int a[maxn],N,d;
int ans[maxn];
int gcd(int a,int b) //最大公约数
{
if(b==0) return a;
else return gcd(b,a%b);
}
int main(){
cin>>N;
for(int i=0;i>a[i];
sort(a,a+N);
if(a[0]==a[1]) cout<
I: 后缀表达式
错误策略:前面数字大的使用加号,后面值小的都采用减号
//这个题如果用贪心的话可能解出的答案是错误的 如果给出的数字为1 2 3 4 5 6 7 + + + - - - 贪心算出来的是7+6+5+4-3-2-1 = 16
而最大的其实是7+6+5+4-(1-3-2)=26
正确策略:输入数中的负数个数num与m的关系:
若num>=m 采用原策略,前(N+1)大加,后m小减
错误代码:
#include
using namespace std;
#define maxn 100010
int n,m;
int a[maxn*2];
int cmp(int x,int y){
return x>y;
}
long long ans=0;
int main(){
cin>>n>>m;
for(int i=0;i>a[i];
}
sort(a,a+n+m+1,cmp);//从大到小排序
//前面数字大的使用加号,后面值小的都采用减号
ans=0;
for(int i=0;i<=n;i++){
ans+=a[i];
}
for(int i=n+1;i<=n+m;i++){
ans=ans-a[i];
}
cout<
正确代码:
#include
using namespace std;
//这个题如果用贪心的话可能解出的答案是错误的 如果给出的数字为1 2 3 4 5 6 7 + + + - - - 贪心算出来的是7+6+5+4-3-2-1 = 16
//而最大的其实是7+6+5+4-(1-3-2)=26
#define maxn 100010
int n,m;
int a[maxn*2];
int cmp(int x,int y){
return x>y;
}
long long ans=0;
int main(){
cin>>n>>m;
int num=0;
for(int i=0;i>a[i];
if(a[i]<0) num++;
}
sort(a,a+n+m+1,cmp);//从大到小排序
//前面数字大的使用加号,后面值小的都采用减号
if(num>=m){
ans=0;
for(int i=0;i<=n;i++) ans+=a[i];//前n大加
for(int i=n+1;i<=n+m;i++) ans=ans-a[i]; //后m小减
cout<