组原成绩

题目描述
花栗鼠科技大学(Hualishu University of Science and Technology, HUST)的计算机组成原理快要出分了。你现在需要计算你的组原成绩如何构成。
具体来说,组原成绩分为三部分,分别是平时出勤 tt ,作业 hh 和考试 ee 。总成绩 w 由如下公式计算:
w = t × 20 % + h × 30 % + e × 50 % w=t \times 20\% +h \times 30\%+e \times 50\% w=t×20%+h×30%+e×50%
其中我们保证 0 ≤ h , e , t ≤ 100 0 \leq h,e,t \leq 100 0h,e,t100
现在你知道了你的组原考试的 t , h , e t,h,e t,h,e,你希望计算你的总成绩。
由于教务系统的特殊性,最终成绩只能是整数,采取 直接去掉小数部分 的办法。

输入格式
一行三个整数,表示 t , h , e t,h,e t,h,e
输出格式
一行一个整数,为 w w w
输入样例

50 100 100

输出样例

90
#include <iostream>

using namespace std;

int main()
{
    int t,h,e;
    cin>>t>>h>>e;
    int ans = (t*20 + h*30 + e*50)/100;
    cout<<ans<<endl;
    return 0;
}
报告赋分

题目描述
花栗鼠科技大学的计算机组成原理实验最终的结课考核方式是提交一份报告。
然而作为任课老师,萝老师不希望大家过于内卷,所以指定了如下规定:
每份报告有一个卷面基础分 a a a
在此基础上:
若是报告字数低于 16 页,则扣 10 分,如果分数低于 0 分了,则记作 0 分。
若是报告字数超过 20 页,每超过 1 页扣 1 分 ,直到分数扣到 0 分为止。
现在你知道了一份报告的卷面基础分 a 和它的页数 p ,请你计算这份报告的最终得分。我们保证 1 ≤ a ≤ 100 , 1 ≤ p ≤ 50 1 \leq a \leq 100,1 \leq p \leq 50 1a100,1p50.

输入格式
本题有多组数据。
第一行一个整数 T ( 1 ≤ T ≤ 1000 ) T(1 \leq T \leq 1000) T(1T1000),表示数据组数。
接下来 T T T 行,每行两个整数 a , p a,p a,p,意义如题所示。

输出格式
共 TT 行,每行一个整数,表示该次询问的数据最终的得分。
输入样例

2
70 17
80 10

输出样例

70
70
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
   int t;
   scanf(" %d",&t);
   while(t--)
   {
       int a, p;
       scanf(" %d %d",&a,&p);
       int grade = 0;
       if(p > 20) grade = p - 20;
       if(p < 16) grade = 10;
       if(a - grade < 0) printf("0\n");
       else
       {
           int ans = a - grade;
           printf("%d\n",ans);
       }
   }
    return 0;
}
竞争得分

题目描述
为了鼓励大家写出更好的作业,花栗鼠科技大学(Hualishu University of Science and Technology, HUST)的组原实验采用了竞争得分的方式。
具体来说,假设有 n n n 个人提交了作业,并且其中原始得分最低的人记作 a m i n a_{min} amin,原始得分最高的人记作 a m a x a_{max} amax,第 i i i 个人的原始得分为 a i a_i ai,那么第 i i i 个人的得分就是:
100 × a i − a m i n a m a x − a m i n 100 \times \frac{a_i-a_{min}}{a_{max}-a_{min}} 100×amaxaminaiamin
由于成绩系统的问题,最终录入的成绩只能是整数,采用直接去掉小数部分的方法。

输入格式
第一行一个整数 n n n 表示人数。( 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1n1000
第二行共 n n n 个整数,为序列 a a a ,其中 a i a_i ai,表示第 i i i 个人的原始作业得分。( 1 ≤ a i ≤ 1000 1 \leq a_i \leq 1000 1ai1000

输出格式
一行,共 n n n 个整数,表示经过更新后每个人的得分。
输入样例

3
1 2 3

输出样例

0 50 100
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1007;
int a[maxn], b[maxn];
int main()
{
    int n;
    scanf(" %d",&n);
    int amax = 0, amin = 1007;
    for(int i = 1; i <= n; i++)
    {
        scanf(" %d",&a[i]);
        amax = max(a[i], amax);
        amin = min(a[i], amin);
    }
    for(int i = 1; i <= n; i++)
        b[i] = 100*(a[i]-amin)/(amax-amin);
    for(int i = 1; i <= n; i++)
        if(i == 1) printf("%d",b[i]);
        else printf(" %d",b[i]);
    return 0;
}
小卡与质数2

题目描述
小卡最近迷上了质数,所以他想把任何一个数都转化为质数!
小卡有 T T T 次询问,每次给你一个数字 x x x,问有多少个比 x x x 小的非负整数 y y y,使得 x ⊕ x\oplus x y 是质数,其中 ⊕ \oplus 表示按位异或。

输入格式
第一行一个正整数 T ( 1 ≤ T ≤ 1 0 5 ) T(1\le T\le10^5) T(1T105),表示有 T T T 组询问。
接下来 T T T 行,每行一个正整数 x ( 1 ≤ x ≤ 1 0 6 ) x(1\le x\le 10^6) x(1x106)

输出格式
对于每组询问,输出一行一个整数,表示答案。
输入样例

9
5
6
7
8
9
10
100
1000
10000

输出样例

2
4
4
2
2
4
22
163
1132
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 7;
int book[maxn], primes[maxn], len, a[maxn];

void work()
{
	book[0] = book[1] = 1;
	for (int i = 2; i < maxn; i++)
	{
		if (!book[i]) primes[len++] = i;
		for (int j = 0; j < len && i * primes[j] < maxn; j++)
		{
			book[i * primes[j]] = 1;
			if (i % primes[j] == 0) break;
		}
	}
	for (int i = 0; i < len; i++)
		for (int j = 30; j >= 0; j--)
			if ((primes[i]>>j)&1)
			{
				a[j]++;
				break;
			}

}

int main()
{
    int t;
    work();
	scanf("%d",&t);
	while (t--)
	{
		int x, ans = 0;
		scanf(" %d",&x);
		for (int i = 30; i >= 0; i--)
			if ((x>>i)&1)
				ans += a[i];
		printf("%d\n",ans);
	}
	return 0;
}
萝卜数据库

题目描述
花栗鼠很喜欢偷吃生产队的大萝卜,因此花栗鼠科技大学正在研究一种新型的数据库,叫做萝卜数据库。
具体来说,它支持 k ( 1 ≤ k ≤ 100 ) k(1 \leq k \leq 100) k(1k100) 个字段,每个字段名都是整数,里面存储的数值也都是整数。
现在你支持如下操作:
向数据库中插入一个记录,它可能只会包含 k k k 个字段的某一部分。具体的操作格式详见“输入格式”。
在数据库中查询有多少条符合条件的记录。
现在你总共有 n n n 次操作( 1    ≤ n ≤ 1000 1 \;\leq n \leq 1000 1n1000),请你对每个回答操作,输出结果。

输入格式
第一行两个整数 n , k n,k n,k,意义如题所述。
接下来的若干行,每行代表一次操作,具体如下:
1   p   x 1    y 1 , . . . , x p   y p 1\ p\ x_1\ \ y_1,...,x_p\ y_p 1 p x1  y1,...,xp yp :表示一个插入操作,其中共有 p p p 个字段,第 i i i 字段的名字是 x i x_i xi,值为 y i y_i yi .此处我们保证 1 ≤ x i ≤ k , 1 ≤ y i ≤ 1000 1 \leq x_i \leq k, 1\leq y_i \leq 1000 1xik,1yi1000,并且 x i , y i x_i,y_i xi,yi 均为整数。
2   x   y m i n   y m a x 2\ x\ y_{min}\ y_{max} 2 x ymin ymax:表示一次查询操作,表示查询所有满足 字段 x x x 的值在 [ y m i n , y m a x ] [y_{min},y_{max}] [ymin,ymax]之间的记录有多少个。

输出格式
对于每个查询操作,输出一行一个整数,表示符合条件的记录个数。
输入样例

4 5
1 2 1 2 2 4
2 2 1 5
1 2 3 5 4 6
2 4 7 8

输出样例

1
0
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
struct node
{
    int c;
	map<int, int> mp;
}g[maxn];

int main()
{
    int n, k;
	scanf("%d %d",&n,&k);
	while (n--)
	{
		int op;
		scanf(" %d",&op);
		if (op == 1)
		{
			int p;
			scanf(" %d",&p);
			for (int i = 0; i < p; i++)
			{
				int a, b;
				scanf(" %d %d",&a,&b);
				g[a].mp[b]++;
				g[a].c++;
			}
		}

		if (op == 2)
		{
			int x, res = 0;
			scanf(" %d",&x);
			int tmin, tmax;
			scanf(" %d %d",&tmin,&tmax);
			for (int i = tmin; i <= tmax; i++)
				if (g[x].mp[i] > 0)
					res += g[x].mp[i];
			printf("%d\n",res);
		}
	}
	return 0;
}
结语

退役转教学, C S P − J / S CSP-J/S CSPJ/S,信奥赛的学习欢迎私聊我啦,祝大家开心 A C AC AC