题目1:长方形中的正方形
题目标签
欧几里得,数学知识要学好
题目描述
给出长方形的长和宽,每次从长方形里撕去最大的正方形,输出最后能得到多少正方形?
输入描述
一行,两个整数 n,m
输出描述
一个整数,表示最后能得到多少正方形。
输入样例:
3 4
输出样例:
4
参考代码
#include <bits/stdc++.h>
using namespace std;
int n,m;
int main()
{
cin>>n>>m;
int res=0;
while(n&&m)
{
if(n>m)n-=m;
else m-=n;
res++;
}
cout<<res<<endl;
return 0;
}
题目2:a与b得到c
题目标签
小学二年级都会的if判断
题目描述
给出a,b,c(3个整数),判断a,b能否通过 +-*/得c,
ab可以交换位置,可以输出 YES,不可以则输出 NO
输入描述
输入包含多组测试数据。
每组数据占一行,包含三个整数 a,b,c
输出描述
每组数据输出一行结果。
数据范围
1≤a,b,c≤10e9
输入样例:
3 8 2
4 8 2
输出样例:
NO
YES
参考代码
#include<bits/stdc++.h>
using namespace std;
long long a,b,c;
int main()
{
while(cin>>a>>b>>c){
if(a+b==c||a-b==c||a*b==c||a/b==c&&a%b==0||b-a==c||b/a==c&&b%a==0)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
题目3:实现一个优先队列
题目标签
可以归为语法基础题,不要光准备dp,拉下队列复习就好,
题目描述
给出优先队列的实现,实现 4 个操作
ADD N P:往队列里加入id为N的优先级为P的任务
NEXT:输出下一个最高优先级的任务的id,如果优先级相同输出id小的任务
若队列中没有任务输出-1
REMOVE N:移除id为N的任务
COUNT:输出队列中的任务数量
输入样例:
10
ADD 1 1
ADD 2 3
ADD 3 2
ADD 4 3
NEXT
REMOVE 3
COUNT
NEXT
NEXT
NEXT
输出样例:
2
2
4
1
-1
参考代码
#include<iostream>
#include<set>
#include<string>
using namespace std;
struct node {
int N, P;
bool operator<(const node& A)const {
return P != A.P ? P > A.P : N < A.N;
}
};
int main() {
int n;
set<node>S;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
string op;
cin >> op;
if (op[0] == 'A') {
node tmp;
scanf("%d%d", &tmp.N, &tmp.P);
S.insert(tmp);
}
else if (op[0] == 'N') {
if (S.size() == 0)
printf("-1\n");
else {
printf("%d\n", S.begin()->N);
S.erase(S.begin());
}
}
else if (op[0] == 'R') {
int ID;
scanf("%d", &ID);
for (auto it = S.begin(); it != S.end(); it++) {
if (it->N == ID) {
S.erase(it);
break;
}
}
}
else if (op[0] == 'C')
printf("%d\n", S.size());
}
return 0;
}
优先队列那题,和
839.模拟堆
有点像#### 第一题还可简化代码
#include <iostream> using namespace std; int n, m, cnt;; int main() { cin >> n >> m; while(n && m) { int sum = n + m; n = sum - min(n, m); m = sum - n; if(n % m == 0) { cnt += n/m; break; } else { cnt += n / m; n = n % m; } } cout << cnt << endl; return 0; }
第一题解法复杂度太高了 过不去
#include[HTML_REMOVED]
using namespace std;
int n,m,ans;
int cal(int a,int b)
{
if(a%b==0)
return a/b;
return a/b+cal(max(a%b,b),min(a%b,b));
}
int main()
{
cin>>n>>m;
int big=max(n,m),sma=min(n,m);
cout<<cal(big,sma)<<endl;
return 0;
}
害怕自己把它想复杂了,噗噗,比如第二题,下意识觉得是不是 a与b通过多次+-*/组合操作得到c