目录
A:分段函数【水题】
B:单词翻转【暴力不水】
C:反反复复【字符串】
D:文件结构“图”【图】
E:Exchange Rates【这不是我能做的】
F:Dungeon Master【没看懂题目什么意思】
G:重建二叉树【树】
A:分段函数【水题】
#include<iostream>
using namespace std;
int main(){
double N;
cin>>N;
if(N>=0&&N<5) printf("%.3f",2.5-N);
if(N>=5&&N<10) printf("%.3f",2-1.5*(N-3)*(N-3));
if(N>=10&&N<20) printf("%.3f",N/2-1.5);
return 0;
}
希望全出这种题哈哈哈哈哈哈哈
B:单词翻转【暴力不水】
①fgets这个输入方式比较特殊
②正着输入,判断条件倒着输出
#include<iostream>
#include<string.h>
using namespace std;
int main(){
char a[500],b[500];
int i,j=0,t;
fgets(a,500,stdin);
for(i=0;a[i]!='\0'&&a[i]!='\n';i++){
if(a[i]!=' '){
b[j++]=a[i];
}
else{
for(t=j-1;t>=0;t--){
printf("%c",b[t]);
}
printf(" ");
j=0;
}
}
for(t=j-1;t>=0;t--){
printf("%c",b[t]);
}
return 0;
}
C:反反复复【字符串】
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 210;
char str[maxn];
char map[maxn][25];
int main(){
int col;
scanf("%d", &col); // 列
scanf("%s", str);
int len = strlen(str);
int row = len / col; // 行
int num = 0; // 字符记录数量
for(int i=0; i<row; i++)
{
if(i%2 == 0)
{
for(int j=0; j<col; j++)
{
map[i][j] = str[num++];
}
}
else
{
for(int j=col-1; j>=0; j--)
{
map[i][j] = str[num++];
}
}
}
for(int j=0; j<col; j++)
{
for(int i=0; i<row; i++)
{
printf("%c", map[i][j]);
}
}
fclose(stdin);
return 0;
}
D:文件结构“图”【图】
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
const int maxn = 30*30+100;
priority_queue<string, vector<string>, greater<string> > q[maxn];
int data_ = 1; // 测试集数量
void print_1()
{
cout << "DATA SET " << data_ << ":" << endl << "ROOT" << endl;
data_ ++;
}
void print_2(int level)
{
for(int i=0; i<level; i++)
{
cout << "| ";
}
}
int main()
{
string s;
cin >> s;
while(s != "#")
{
print_1();
int level = 0;
while(s != "*")
{
if(s[0] == 'f')
{
q[level].push(s);
}
else if(s[0] == 'd')
{
level++;
print_2(level);
cout << s << endl;
}
else if(s[0] == ']')
{
while(!q[level].empty())
{
print_2(level);
cout << q[level].top() << endl;
q[level].pop();
}
level--;
}
cin >> s;
}
while(!q[level].empty())
{
print_2(level);
cout << q[level].top() << endl;
q[level].pop();
}
cout << endl;
cin >> s;
}
fclose(stdin);
return 0;
}
E:Exchange Rates【这不是我能做的】
这不是我能做的
F:Dungeon Master【没看懂题目什么意思】
1253 没看懂题啥意思
G:重建二叉树【树】
#include<iostream>
#include<string.h>
using namespace std;
//http://bailian.openjudge.cn/practice/2255/
//每次根据前序中找到根节点,然后对中序左右分别处理直到空
char a[10000],b[10000];
int len1,len2;
void f(int l,int l2,int r2){ //l1是前序左端点,l2,r2是中序左右端点
if(l2==r2)return; //子树为空
char k=a[l];//前序中的第一个值是根节点
int rr;
for(int i=l2;i<r2;i++){
//从中序中找根节点,分出左右子树
if(b[i]==k){
rr=i;
break;//rr左边是左子树,右边是右子树
}
}
f(l+1,l2,rr);
f(l+(rr-l2+1),rr+1,r2);
cout<<k;
}
int main(){
while(cin>>a>>b){
len1=strlen(a);
len2=strlen(b);
f(0,0,len2);
cout<<endl;
}
}
后面的都不是我能做的了