导图社区 NOIP模拟题目
C类中的NOIP模拟题目,你想不想来挑战一下呢?这里包括了4道简单的题目和2道困难的题目,快来试一试吧!
编辑于2022-06-29 15:58:05NOIP模拟题目
5.[NOIP2016]买铅笔
题目:
输入输出描述:
样例:
提示:
思路:其实不用定义两个数组,可以定义两个变量,输入完后立刻算出钱数,然后再和最小值比较大小,这样就很容易解答了。
代码演示 : #include <bits/stdc++.h> using namespace std; int main() { int n,a,b,money = 0,min = 2147483647; cin >> n; for (int i = 1;i <= 3;i++) { cin >> a >> b; money = n / a * b; if (n / a * a < n) money += b; if (money < min) min = money; } cout << min; return 0; }
6.[NOIP2010]接水问题
题目:
输入输出描述:
样例1: 输入: 5 3 4 4 1 2 1 输出: 4 样例2: 输入: 8 4 23 71 87 32 70 93 80 76 输出: 163
样例说明:
思路:模拟每一秒,枚举每一个水龙头,定义一个变量,如果这个变量值为-1,说明这个水龙头已经没有人了。每一秒给接水的人加一的水,如果已经达到需要接水的水量,如果没人了,就关闭水龙头。如果有下一个人,不要忘了归零。定义一个变量,表示已经完成的人数,如果等于总人数了,就把答案赋值成现在的秒数,最后输出答案。
代码演示: #include <bits/stdc++.h> using namespace std; const int N = 10010; const int M = 110; int w[N]; int now[M],who[M]; int main() { int n,m; scanf("%d%d",&n,&m); for (int i = 1;i <= n;i++) scanf("%d",&w[i]); //输入需要的水量 for (int i = 1;i <= m;i++) { who[i] = i;//给同学编号 now[i] = 0; } int nxt = m + 1; int ans = -1,cnt = 0; for (int i = 1;i <= 1000000;i++)//模拟每一秒 { for (int j=1;j<=m;j++)if(who[j]!= -1) { now[j]++;//给接水的同学加一的水 //判断是否加满 if (now[j] == w[who[j]]) { if (nxt > n) { //如果剩下的的人数比水龙头数少 //关闭水龙头 who[j] = -1; } else { who[j] = nxt; nxt++; } now[j] = 0; cnt++;//完成同学数加一 } } if (cnt == n) { //如果都完成了 //就退出循环 ans = i; break; } } cout << ans << endl; return 0; }
4.[NOIP2015]金币
题目:
输入输出描述:输入只有 1 行,包含一个正整数 K ,表示发放金币的天数。输出只有 1 行,包含一个正整数,即骑士收到的金币数。
样例1:输入:6 输出:14 样例2:输入:1000 输出:29820
思路:我们需要定义很多变量:天数、金币数和小旗。小旗是记录在第几天停止的。
代码演示: #include <bits/stdc++.h> using namespace std; int main() { int k; scanf("%d",&k); int sum = 0;//总天数 int flag = 1;//小旗 int ret = 0;//金币数 for (int i = 1;i <= k;i++) { sum += i;//总天数加i flag = i;//小旗改为i ret += i * i;//累加金币数 if (sum >= k) { sum -= i;//把sum还原成小于k ret -= i * i;//把ret还原成前一天的数量 break; } } ret += (k - sum) * flag;//加上金币剩下的数量 printf("%d\n",ret); return 0; }
3.[NOIP2009]多项式输出
题目:
输入输出描述: 输入共有 2 行 第一行 11 个整数,nn,表示一元多项式的次数。 第二行有 n+1n+1 个整数,其中第 ii 个整数表示第 n-i+1n−i+1 次项的系数,每两个整数之间用空格隔开。 输出共 1 行,按题目所述格式输出多项式。
样例1: 输入: 5 100 -1 1 -3 0 10 输出: 100x^5-x^4+x^3-3x^2+10 样例2: 输入: 3 -50 0 0 1 输出: -50x^3+1
思路:根据输入的数字,输出多项式。
代码演示: #include <bits/stdc++.h> using namespace std; int a[110]; int main() { int n; scanf("%d",&n); for (int i = n;i >= 0;i--) { scanf("%d",&a[i]); } for (int i = n;i >= 0;i--) //从5次方开始枚举 { if (a[i] == 0) { continue; } if (i < n)//输出加号 { if (a[i] > 0) { printf("+"); } } if (abs(a[i]) != 1)//输出常数 { printf("%d",a[i]); } else { if (a[i] < 0) printf("-"); if (i == 0) printf("1"); } if (i > 1)//输出次方 { printf("x^%d",i); } else if (i == 1)//输出字母x { printf("x"); } else { } } return 0; }
2.[NOIP2011]数字反转
题目:
输入输出描述:输入共 1 行,一个整数 N。输出共 1 行,一个整数,表示反转后的新数。
样例1:输入:123 输出:321 样例2:输入:-380 输出:-83
思路:定义一个变量来保存反转后的答案,使用while循环后就非常简单了,把这个变量乘十后再加上输入数的个位数,输入数再除以十,一直循环,到最后输出答案就可以了。
代码演示: #include <bits/stdc++.h> using namespace std; int main() { int n,s = 0; cin >> n; if (n < 0)//不要忘了输出负号 { cout << '-'; n *= -1; } if (n == 0)//特判 { cout << 0; return 0; } while (n > 0)//循环 { s = s * 10 + n % 10; n /= 10; } cout << s; return 0; }
1.[NOIP2008]ISBN号码
题目:
输入输出描述: 输入: 输入只有一行,是一个字符序列,表示一本书的 ISBN 号码。 输出: 输出共一行,假如输入的 ISBN 号码的识别码正确,那么输出Right,否则,按照规定的格式,输出正确的 ISBN 号码。
样例1:输入:0-670-82162-4 输出:Right 样例2:输入:0-670-82162-0 输出:0-670-82162-4
思路:按照题目的公式,一步一步推算。如果不一样,算出正确答案。
代码演示: #include <bits/stdc++.h> using namespace std; char s[20]; int main() { scanf("%s",s); int n = strlen(s); int sum = 0; int cnt = 1; for (int i = 0;i < 11;i++) { if (s[i] >= '0' && s[i] <= '9') { sum += (s[i] - '0') * cnt; cnt++; }//计算 } if (sum%11==10&&s[n-1]=='X'||sum%11==s[n-1]-'0') printf("Right");//正确 else//错误 { if (sum % 11 == 10) s[n-1] = 'X'; else s[n-1] = '0' + sum % 11; printf("%s",s); } return 0; }