1、购物单
- Excel数据处理计算
- 复制到txt文本里面,利用Ctrl+H替换掉**这些字符和折扣。预处理好数据之后用代码计算
int main(){
freopen("DATA.txt","r",stdin);
double ans = 0,a,b;
char buf[1110];
while(scanf("%s%lf%lf",buf,&a,&b)!=EOF){
ans += a*b/100;
}
printf("%lf\n",ans);
return 0;
}
//5136.859500
答案:5200
2、等差素数列
3、承压计算
#include <bits/stdc++.h>
using namespace std;
int main(){
double num[30][30]={0};
for(int i=0;i<=28;i++)
for(int j=0;j<=i;j++)
cin>>num[i][j];
//解题关键:第i行的第j个平均分给第i+1行的第j个和第i+1行的第j+1个
for(int i=0;i<=28;i++)
for(int j=0;j<=i;j++){
num[i+1][j]+=num[i][j]/2;
num[i+1][j+1]+=num[i][j]/2;
}
double minn=999999999,maxn=0;
for(int i=0;i<=29;i++){
if(maxn<num[29][i]) maxn=num[29][i];
if(minn>num[29][i]) minn=num[29][i];
}
cout<<fixed<<maxn*2086458231/minn<<endl;
}
答案:72665192664
4、方格分割
仔细观察样例数据可以发现,要满足题目所需要求,只需要剪切的线关于图案的中点中心对称。那么我们可以将格子格子之间接壤的看作边,边与边相交的看作点。则从(3,3)点出发,找一条边到达图案的外圈,不过值得注意的是,从(3,3)出发的是看错两个人出发,两个人的线路一直是对称。所以dfs中标记的时候要一步标记两个。
最后的结果要除以4,因为题目中说要旋转对称的图形属于是同一种。
#include <bits/stdc++.h>
using namespace std;
int vis[8][8]={0};//按顶点搜索0~6共7个——故7x7的二维数组
int mov[4][2]={1,0,-1,0,0,1,0,-1};
int ans;
void dfs(int x,int y){
if(x==0||x==6||y==0||y==6) {//退出条件
ans++;
return;
}
for(int i=0;i<4;i++){//上下左右移动
int xx=x+mov[i][0];int yy=y+mov[i][1];//移动一步
if(!vis[xx][yy]){ //判断下一步是否为未走过的路线,如果是则继续,不是就跳出循环
vis[xx][yy]=1;
vis[6-xx][6-yy]=1;//对称标记走过的路线
dfs(xx,yy);//继续下一步
vis[xx][yy]=0;
vis[6-xx][6-yy]=0;
}
}
}
int main() {
vis[3][3]=1;//一定要记得标记!!!
dfs(3,3);
cout<<ans/4;
return 0;
}
答案:509
5、取数位
递归的思想
答案:f(x/10,k)
6、最大公共子串
最大公共子串长度问题就是:
求两个串的所有子串中能够匹配上的最大长度是多少。
比如:"abcdkkk" 和 "baabcdadabc",
可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。
下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。
请分析该解法的思路,并补全划线部分缺失的代码。
#include <stdio.h>
#include <string.h>
#define N 256
int f(const char* s1, const char* s2)
{
int a[N][N];
int len1 = strlen(s1);
int len2 = strlen(s2);
int i,j;
memset(a,0,sizeof(int)*N*N);
int max = 0;
for(i=1; i<=len1; i++){
for(j=1; j<=len2; j++){
if(s1[i-1]==s2[j-1]) {
a[i][j] = __________________________; //填空
if(a[i][j] > max) max = a[i][j];
}
}
}
return max;
}
int main()
{
printf("%d\n", f("abcdkkk", "baabcdadabc"));
return 0;
}
a[i][j]的意义表示s1串前i个字符和s2串前j个字符的都各自包含最后一个字符的最大公共子串长度
答案:a[i-1][j-1]+1