先用数组按输入顺序存放,再读入要找寻的目标数tmp,遍历一遍数组即可找到答案。
代码示例:
#include
const int N = 11000;
int a[N],tmp,n;
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++) scanf("%d",a+i);
scanf("%d",&tmp);
for(int i = 1;i <= n;i++){
if(a[i] == tmp){
printf("%d\n",i);
return 0;
}
}
printf("-1\n");
return 0;
}
主要考察结构体的用法,也可以用一个int型数组和string类型数组来做。
代码示例:
#include
#include
struct Stu{
int Score;
char name[25];
};
Stu students[110];
const int INF = 0x3f3f3f3f;
int main(){
int n;
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%d%s",&students[i].Score,students[i].name);
}
int mx = -INF;
char tname[25];
for(int i = 1;i <= n;i++){
if(students[i].Score > mx){
mx = students[i].Score;
memcpy(tname,students[i].name,25);
}
}
puts(tname);
return 0;
}
按照题意,就是从这七组数据中找到和最大的那一组即为答案。
代码示例:
#include
int main(){
int a,b,ans,mx = -1;
for(int i = 1;i <= 7;i++){
scanf("%d%d",&a,&b);
if(a+b > mx){
mx = a+b;
ans = i;
}
}
printf("%d\n",ans);
return 0;
}
这题主要是考察结构体用法,因为判断比较多,逻辑一定不能乱,按照逻辑来写,就会很轻松。
代码示例:
#include
#include
using namespace std;
struct Student
{
char name[20]; //姓名
int score1; //期末成绩
int score2; //班级成绩
char leader; //是否是班干部
char weststudent; //是否是西部学生
int article; //论文数
int money; //个人总奖金
};
Student a[100];
int main()
{
int max=0; //学生编号
int sum=0; //总奖金
int n; //学生总数
cin>>n; //输入学生总数
for(int i=0; i>a[i].name;
cin>>a[i].score1;
cin>>a[i].score2;
cin>>a[i].leader;
cin>>a[i].weststudent;
cin>>a[i].article;
}
for(int j=0; j80&&a[j].article>=1)
a[j].money+=8000;
if(a[j].score1>85&&a[j].score2>80)
a[j].money+=4000;
if(a[j].score1>90)
a[j].money+=2000;
if(a[j].score1>85&&a[j].weststudent=='Y')
a[j].money+=1000;
if(a[j].score2>80&&a[j].leader=='Y')
a[j].money+=850;
sum+=a[j].money;
}
for(int k=0; ka[max].money)
max=k;
}
cout<
#include
using namespace std;
int main()
{
int M, i, x, min=10000, max=-10000;
cin >> M;
for (i=0; i> x;
if (x > max) max = x;
if (x < min) min = x;
}
cout << max-min << endl;
return 0;
}
这题也没什么特殊的,但是却用到了判断素数的函数,判断一个数x是否为素数的函数模板需要牢记。
判断素数模板:
#include
bool isPrime(int x){
if(x < 2) return false;
if(x == 2 || x == 3) return true;
if(x % 2 == 0) return false;
for(int i = 3;i*i <= x;i += 2)
if(x%i == 0) return false;
return true;
}
int main(){
for(int i = 1;i <= 1000;i++){
if(isPrime(i)) printf("%d ",i);
}
return 0;
}
在求最大值的基础上再开一次循环即可。
去掉一个最大值,一个最小值,然后求平均值,再求每个元素与平均值差的绝对值,找出绝对值最大的值。
代码示例:
#include
#include
#include
using namespace std;
int main()
{
int n, i, x=0, y=0;
double a[300], maxd, mind, sum=0.0, avg, deviation=0.0;
cin >> n;
for (i=0; i> a[i];
if (i == 0) maxd=mind=a[i];
if (a[i] > maxd){
x = i;
maxd = a[i];
}
if (a[i] < mind){
y = i;
mind = a[i];
}
sum += a[i];
}
sum -= maxd;
sum -= mind;
avg = sum / (n-2);
for (i=0; i deviation) deviation = d;
}
cout << fixed << setprecision(2) << avg << " ";
cout << fixed << setprecision(2) << deviation << endl;
return 0;
}
开一个标记数组即可
代码示例:
#include
using namespace std;
int main()
{
int n, x, i, Fmax=0;
int histogram[10000]={0}; // 记录每个数字出现的次数
cin >> n;
for (i=0; i> x;
histogram[x]++;
if (x > Fmax) Fmax = x;
}
for (i=0; i<=Fmax; i++)
cout << histogram[i] << endl;
return 0;
}
本题考察将字符类型转换为整数类型的方法,本题初做起来会觉得写起来很麻烦,但其实只要逻辑思路清晰,写起来也很轻松。注意要判断边界范围。
#include
#include
#include
using namespace std;
int n,tot;
struct Node{
int a,idx;
}num[4000];
void splitStr(string str,int idx){
int tmp = 0;
for(int i = 0;str[i];i++){
if(str[i] == ','){
num[++tot].a = tmp;
num[tot].idx = idx;
tmp = 0;
}else{
tmp = tmp*10 + str[i]-'0';
}
}
num[++tot].a = tmp;
num[tot].idx = idx;
tmp = 0;
}
int main(){
string str;
cin >> n;
for(int i = 1;i <= n;i++){
cin >> str;
splitStr(str,i);
}
int mx = -1;
for(int i = 1;i <= tot;i++) mx = max(mx,num[i].a);
printf("%d\n",mx);
bool flag = true;
int pre = -1;
for(int i = 1;i <= tot;i++){
if(num[i].a == mx && num[i].idx != pre){
if(flag == false) printf(",");
printf("%d",num[i].idx);
flag = false;
pre = num[i].idx;
}
}
}
#include
#include
using namespace std;
int main()
{
char cur;
string s;
int k, i, times=0;
cin >> k >> s;
cur = s[0];
for (i=0; i= k){
cout << cur << endl;
return 0;
}
}
else{
cur = s[i];
times = 1;
}
}
cout << "No" << endl;
return 0;
}
就是找最长连续相同的数的长度嘛
#include
using namespace std;
int main()
{
int n, i, x, cur, len=1, maxl=1;
cin >> n >> x;
cur = x;
for (i=1; i> x;
if (x == cur){
len++;
}
else{
len = 1;
cur = x;
}
if (len > maxl) maxl = len;
}
cout << maxl << endl;
return 0;
}
n很大,所以二重循环有点悬,但是每个整数却很小,在[10,100],所以可以用标记数组来解决
#include
using namespace std;
int main()
{
int n, i, x, table[20001]={0};
cin >> n;
for (i=0; i> x;
table[x]++;
if (table[x] == 1){
cout << x << " ";
}
}
cout << endl;
return 0;
}
因为我们的地毯是按顺序铺的嘛,所以最后一个覆盖该点的地毯就是最上面的,就是所求答案。
#include
using namespace std;
int main()
{
int n, a[10001], b[10001], g[10001], k[10001], x, y, no=-1, i;
cin >> n;
for (i=1; i<=n; i++) {
cin >> a[i] >> b[i] >> g[i] >> k[i];
}
cin >> x >> y;
for (i=1; i<=n; i++) {
if ((x>=a[i]&&y>=b[i]) && (x<=(a[i]+g[i])&&(y<=(b[i]+k[i])))) no = i;
}
cout << no << endl;
return 0;
}
#include
#include
using namespace std;
int main()
{
int m, n, i, j, time=0, w[10000]={0}, tap[100]={0};
cin >> n >> m;
for (i=0; i> w[i];
for (i=0; i
这题将病人分为两类:老年人和非老年人。对于非老年人的输出很简单,直接按照读入顺序输出即可;对于老年人的输出则需要按照年龄降序,并当年龄相同时按照读入顺序输出。于是我们可以先对老年人进行排序并输出,随后再按读入顺序输出非老年人即可。由于数据量不大,所以对于老年人的输出采取了O(N^2)的写法。
#include
struct Node{
char id[15];
int age;
}nodes[150],olders[150];
bool vis[150];
int main(){
int n,tot = 0;
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%s%d",nodes[i].id,&nodes[i].age);
if(nodes[i].age >= 60) olders[tot++] = nodes[i];
}
bool flag = true;
while(flag){
flag = false;
int mx = -1,idx;
for(int i = 0;i < tot;i++){
if(vis[i] == false && olders[i].age > mx){
idx = i;
mx = olders[i].age;
}
}
if(mx != -1){
printf("%s\n",olders[idx].id);
flag =true;
vis[idx] = true;
}
}
for(int i = 1;i <= n;i++){
if(nodes[i].age < 60) printf("%s\n",nodes[i].id);
}
return 0;
}
这题容易想到的思路有两种,一种是先排序,再统计有多少个不同的数并输出;另一种方法就是用标记数组,这里采用第二种方法,即用标记数组来做。
#include
using namespace std;
int vis[1001];
int main(){
int N,n;
cin >> N;
for(int i = 1;i <= N;i++){
cin >> n;
vis[n] = 1;
}
int cnt = 0;
for(int i = 1;i <= 1000;i++){
if(vis [i]) cnt++;
}
cout << cnt << endl;
for(int i = 1;i <= 1000;i++){
if(vis [i]) cout << i << " ";
}
return 0;}
这题主要工作在于如何读入这些个数不确定的单词。由于两个单词中间可能有若干个空格间隔,所以我们对于空格的判断是分割单词的重点。代码中采用string类型变量,简化代码并增强可读性,当然用char类型数组也是可以的。分割完单词之后就是按字典序排序,而去重则可以在输出时候完成,具体见代码。
#include
#include
#include
using namespace std;
int tot = 0;
string str,tstr = "",words[150];
int main(){
getline(cin,str);
for(int i = 0;str[i];i++){
if(str[i] == ' ' && tstr == "") continue;
else if(str[i] == ' '){
words[tot++] = tstr;
tstr = "";
continue;
}
tstr += str[i];
}
words[tot++] = tstr;
sort(words,words+tot);
for(int i = 0;i < tot;i++){
if(i != 0 && words[i] == words[i-1]) continue;
cout << words[i] << endl;
}
return 0;
}