题目一
分析:
本题考查的是字符串查找。
思路:
设置数组分别存储E、A、S、Y四个字母的位置,初始为0(位置从1开始记)。在循环中寻找每个字母在其前一个字母被记录之后(例如A的前一个字母是E),第一次出现的位置。最后判断,数组值是否全不为0,是则符合条件。
代码:
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN=100;
int main(){
char c[MAXN];
while(cin>>c){
int res[4]={0,0,0,0};
int n=strlen(c);
for(int i=0;i<n;i++){
if(c[i]=='E') res[0]=i+1;
if(res[0]!=0 && c[i]=='A') res[1]=i+1;
if(res[1]!=0 && c[i]=='S') res[2]=i+1;
if(res[2]!=0 && c[i]=='Y') res[3]=i+1;
}
if(res[0]!=0 && res[1]!=0 && res[2]!=0 && res[3]!=0 ) cout<<"easy"<<endl;
else cout<<"difficult"<<endl;
N--;
}
return 0;
}
/*
Easy
EASY
ESDGGAsy
EASTyyyyyy
EesahfsEAfdfghSY
*/
题目二
分析:
本题考查的是结构体排序;sort()函数运用。
思路:
构建结构体,用sort函数排序,编写排序原则complare函数,按照折扣力度由高到低依次排列。
循环中计算付款数,注意判断条件。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN=100;
typedef struct{
float z=1;
int H=0;
}FRI;
bool complare(FRI fri1,FRI fri2){
return fri1.z<fri2.z;
}
int main(){
FRI fri[MAXN];
int N;
int T;
int paid=0;
int final=0;
cin>>N>>T;
for(int i=0;i<N;i++){
cin>>fri[i].z>>fri[i].H;
}
sort(fri,fri+N,complare);
int i=0;
while(T && i!=N){
if(T>fri[i].H){
paid = fri[i].H;
final += fri[i].H*fri[i].z;
}
else{
paid = T;
final += T*fri[i].z;
}
cout<<T<<endl;
T -= paid;
i++;
}
final += T;
cout<<final;
return 0;
}
题目三 字符串暴力匹配
分析:
字符串匹配问题,S字符串与T字符串相匹配,逐个对比,相等则指针同时后移,不等,指向T的指针移到T头字符,指向S的移向S头字符的下一个字符(之后是下一个字符的下一个字符)。
思路:
使用_i来记录下次回溯指针应当指向的字符位置。
代码:
#include <iostream>
#include <cstring>
#include <string.h>
using namespace std;
int search(char* s,char* t){
int N=strlen(s);
int n=strlen(t);
int i=0,_i=0;
int j=0;
while(_i<N && j<n){
_i++;
if(s[i]==t[j]){
i++;
j++;
}
else{
i=_i;
j=0;
}
}
if(i-j+1<=N && j==n) return i-j+1;
else return -1;
}
int main(){
char s[100],t[10];
cin.getline(s,100);
cin.getline(t,10);
int n=search(s,t);
cout<<n<<endl;
return 0;
}
-结束-