CSP-J复赛模拟赛2————赵义弘补题报告

一.题目目录

|----|----------|
| T1 | 简单的问题 |
| T2 | 寻找"五维空间" |
| T3 | 约定 |
| T4 | 遗忘的过去 |

二.模拟赛题目期望得分

T1:100

T2: 60

T3: 60

T4: 80

因为蒟蒻自己没有参加这场模拟赛,所以就只有期望得分了

三.比赛分析

T1:[简单的问题(problem)]

题目大意:给你一个分段函数求它的一些对应的函数值
思考过程:读了一遍题以后发现这道题的数据范围
对于30%的数据,𝑥≥101

另外40%的数据,𝑥≤10
对于100%的数据,𝑥≤1000000

如果你想要AC一定要将cin和cout改成scanf和printf
同时蒟蒻我看了一下上面的题目描述和输入和输出样例,发现:如果x是小于等于100时,那么输出的答案一定是91。如果x是大于等于101时输出的答案一定是x-10
代码实现(由于蒟蒻我的辟谷报废了,所以蒟蒻我是现写的代码,写的可能不大好)
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	int x;
	while(~scanf("%d",&x)&&x!=0){
		if(x>=101) printf("%d\n",x-10);
		else printf("91\n",91);
	}
	return 0;
}

我觉得是T1题因该不会有人AC不了吧

T2:[寻找"五维空间"(space)]

题目大意:帮助两个帅哥(小A和小C)找到要求的最简真分数。
思考过程:在看到这个样例的蒟蒻我都蒙了,这啥呀

仔细一看后我发现199/299约等于三分之二,也就是输入样例的第一行,至于输入样例的第二行则是输出样例的两个数所在的区间范围,那了解样例后的蒟蒻我就是无敌的。(后面会打脸)

代码实现:

自信的蒟蒻提交了代码

自信的蒟蒻寄了(只有60分)

毕竟失败乃成功他娘,错误代码也是要放出来的

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int x,y;
int n,d,m;
int ans=1.0*100000000000;
int X,Y;
int inf;
int gcd(int x,int y){
    if(y==0) return x;
    gcd(y,x%y);
}
bool check(int x,int y){
    if(x==n&&y==d) return 0;
    if(gcd(x,y)!=1) return 0;
    return 1;
}
int main(){
    cin>>n>>d>>m;
    double p=1.0*n/d;
    double ans=inf;
    for(int x=1;x<m;x++){
        for(int y=x+1;y<=m;y++){
            if(check(x,y)){
                double now=1.0*x/y;
                if(abs(ans-p)>abs(now-p)){
                	ans=now;
					X=x;
					Y=y; 
				}
            }
        }
    }
    cout<<X<<" "<<Y<<endl;
    return 0;
}

再听完老师对这道题目的细致讲解后,我应该理解了(但是我的代码还没有改完,所以放的是60分的代码,可恶的TLE)

T3:[约定(agreement)]

题目大意:神秘人(姑且叫他小s吧)需要知道通过尝试不同的排列最多能够获得多少灵力值(一种排列恰好有 𝑘 个"有效关系",那么摆出这样的排列就能提供 1点灵力值,同一种排列只会提供一次灵力值)
由于这个问题的答案可能非常的大,小A根本算不明白,而小s只会魔法,于是小A希望你能帮他解决这个问题。答案对2012取模
思考过程:先看样例
从样例中我们得知了输入样例的第一个为n(3)张魔法牌,而输入样例中的第二个则告诉我们了一共有k(1)种"有效关系"。从输出样例中我们知道了对于输出样例来说共有四种排列的结果,分别是[3,1,2],[2,1,3],[1,3,2],[2,3,1]而这四种排列的结果只有一个"有效关系",所以输出4.
代码实现:
蒟蒻我在老师的讲解下,完成了这道题目
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,k;
int dp[1005][1005];
int main(){
    cin>>n>>k;
    for(int i=0;i<=n;i++) dp[i][0]=1;
    	for(int i=1;i<=1000;i++){
    		for(int j=1;j<=1000;j++){
            	dp[i][j]=dp[i-1][j-1]*(i-j)+dp[i-1][j]*(j+1);
            	dp[i][j]%=2012;
        }
	} 
    cout<<dp[n][k];
    return 0;
}

一定要注意要把dp这个数组初始化一下,否则就会直接输出0

加上那个dp[i][0]=1,就能过了

T4[遗忘的过去(forget)]

题目大意:蒟蒻我感觉很像d4的supermarket,好像就改了个样例和输入和输出,实话说看supermarket好像懂得更快,推荐去看d4的supermarket

废话不多说,直接上代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=100005; 
priority_queue<int,vector<int>,greater<int> > qu;
int n,cnt=0;
struct node{
	int maxt,v;
}a[N];
bool cmp(node x,node y){
	if(x.maxt==y.maxt) return x.v<y.v;
	return x.maxt<y.maxt;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].maxt;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i].v;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		qu.push(a[i].v);
		if(qu.size()>a[i].maxt){
			qu.pop();
		}
	}
	while(!qu.empty()){
		cnt+=qu.top();
		qu.pop();
	}
	cout<<cnt;
	return 0;
}
相关推荐
爱吃生蚝的于勒2 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
ChoSeitaku7 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
Fuxiao___7 小时前
不使用递归的决策树生成算法
算法
我爱工作&工作love我7 小时前
1435:【例题3】曲线 一本通 代替三分
c++·算法
白-胖-子8 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower8 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯8 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
Sunyanhui18 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展
一个不喜欢and不会代码的码农8 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode
前端郭德纲8 小时前
浏览器是加载ES6模块的?
javascript·算法