目录
<1>
<2>
思路
<1>
给你 4 个整数 a,b,c,d,你需要回答 是奇数还是偶数。
#include<stdio.h>
#define int long long
int f(int a)
{
if(a%2==0)
{
return 0;
}
else
{
return 1;
}
}
signed main()
{
int a,b,c,d;
scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
if(b==0)
{
a=1;
}
else
{
a=f(a);
c=f(c);
d=f(d);
}
if((a*c+d)%2!=0)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
<2>
#include<stdio.h>
int main()
{
int n,k;
scanf("%d",&n);
int a[n][n];
for(int i=0;i<n;i++)
{
a[0][i]=1+i;
}
for(int i=1;i<n;i++)
{
for(int j=0;j<i;j++)
{
a[i][j]=a[j][i-1];
}
k=a[i-1][n-1];
for(int j=i;j<n;j++)
{
a[i][j]= ++k;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
思路
这种不明确的,构造的,通常没有定解
看样例:
对于第一行1 2 3...n 直接赋值
发现n=3时,太少,加一行,当n=4时:
根据样例推导:
1 2 3 4
4 5 6 7
1 7 8 9
4 6 8 10 这行凑的
发现这个规律用代码很难写出来,不好推公式
换一种思路:
沿用这种竖行的思路(前面说了“这种不明确的,构造的,通常没有定解”,所以可以跟样例不同,样例只是提供一种思路)
推到这里要选前面两个数
竖着25比较方便
接着:
1 2 3 4
1 5 6 7
2 5 8 9
这时
且 3 6 8 正好没和 2 5重复
接着,补齐:
1 2 3 4
1 5 6 7
2 5 8 9
3 6 8 10
观察,规律,总结:
首先理解出题意来,再对矩阵放大,3*3太小。放大推出来的太乱了,没什么规律,就要寻求简化。取一个 第一 和 一个 最后 太乱了,就想能不能都在前面取?
选第三行从简就近原则,选两个数,竖着25正好可以
继续竖着,选左边还是右边,还是就近从简,选紧贴 2 5的,正好发现不影响,并且就是这样的规则,再放大同样适用。
默认多答案,从简就近。
理解完就是找规律,想着放大好观察,然后推出来了一个巨乱的样例,发现不行,推倒重来,按照就近从简,第二行,第三行一写出来差不多就有规律了,第四行更长更大,看的更明白,发现就是这样做的。
总结公式
将矩阵转化为 i j的代码:
推出转移的公式:
从第二行看:
循环 i从1开始
k是上一行最后一个数
之后,处理后面这些,发现是刚才接着往后
刚才到i-1,接下来就是i了,所以从i开始,到n结束
可以知道第一个数是上一行+1,之后每个数,逐个增加
用k记录上一行的最后一个,并且每次++
注意:要先加后用:++k