本地小黑板,学习不迷路
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(j==1 || j==n){ //第1列和第n列
cout<<'|';
}else if(i==1 || i==(n+1)/2 || i==n){//第1行,中间行,第n行
cout<<'-';
}else{ //其余位置
cout<<'x';
}
}
cout<<endl;
}
return 0;
}
/* Problem: ⼩杨的⽇字矩阵
Language: C++ Result: 正确 Time: 2026-07-14 20:15:30
User: admin Problem: 4045 contest_id: 0*/
#include<iostream>
using namespace std;
int a,b,c,ans=0,bb,cc;//bb表示瓶盖数量,cc表示空瓶数量
int main(){
cin>>a>>b>>c;
ans+=a; //先喝掉a瓶水
bb=a; cc=a; //剩下的瓶盖和空瓶子
while(bb>=b || cc>=c){ //瓶盖 或 空瓶子 都可以换
if(bb>=b){ //瓶盖够换
ans+=bb/b; //喝水
cc+=bb/b; //空瓶子数量更新
bb=bb/b+bb%b; //瓶盖数量更新
}
if(cc>=c){ //空瓶子够换
ans+=cc/c; //喝水
bb+=cc/c; //瓶盖数量更新
cc=cc/c+cc%c; //空瓶子数量更新
}
}
cout<<ans;
return 0;
}
/* Problem: 汽水兑奖.
Language: C++ Result: 正确 Time: 2026-07-14 19:46:57
User: admin Problem: 2009 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
int q=n%10;
int b=n/10%10;
int s=n/100%10;
int g=n/1000%10;
cout<<9-q<<9-b<<9-s<<9-g;
return 0;
}
/* Problem: 数字加密.
Language: C++ Result: 正确 Time: 2026-07-14 19:36:10
User: admin Problem: 1963 contest_id: 0*/
#include<iostream>
using namespace std;
int a,b,x,y,ans=0;
int main(){
cin>>a>>b>>x>>y;
if(a<=b&&x<=y){ //永远不能超过
cout<<"Impossible";
}else{
while(a<=b){ //未超过,继续追
ans++; //一天过去了
a+=x;
b+=y;
}
cout<<ans;
}
return 0;
}
/* Problem: 刷题竞赛.
Language: C++ Result: 正确 Time: 2026-07-14 19:16:02
User: admin Problem: 1954 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=0;i<=n/2;i++){ //枚举自行车的数量
int j=(n-2*i)/3; //计算出三轮车的数量
if(2*i+3*j==n){ //轮子数量刚刚好
cout<<i<<" "<<j<<endl;
}
}
return 0;
}
/* Problem: 两轮车和三轮车.
Language: C++ Result: 正确 Time: 2026-07-14 19:08:48
User: admin Problem: 1232 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=2*n+1;i++){ //有2*n+1行
for(int j=1;j<=2*n-1;j++){ //只考虑2*n-1列
if(i==1 || i==n+1 || i==2*n+1) cout<<'*';
else if(j==1) cout<<'*';
else if(j==2*n-1) cout<<" *"; //空格+星号
else cout<<' ';
}
cout<<endl; //换行
}
return 0;
}
/* Problem: 打印B图案.
Language: C++ Result: 正确 Time: 2026-07-14 19:03:59
User: admin Problem: 1940 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
cin>>n;
while(n!=495){ //就需要打乱n,用最大的-最小的
int g=n%10,s=n/10%10,b=n/100%10;
int mx=max(b*100+s*10+g,b*100+g*10+s); //最大值
mx=max(mx,max(s*100+b*10+g,s*100+g*10+b));
mx=max(mx,max(g*100+b*10+s,g*100+s*10+b));
int mn=min(b*100+s*10+g,b*100+g*10+s); //最小值
mn=min(mn,min(s*100+b*10+g,s*100+g*10+b));
mn=min(mn,min(g*100+b*10+s,g*100+s*10+b));
n=mx-mn; //最大值-最小值
ans++; //每次变化一轮,+1
}
cout<<ans;
return 0;
}
/* Problem: 数字黑洞
Language: C++ Result: 正确 Time: 2026-07-13 20:16:04
User: admin Problem: 4023 contest_id: 0*/
#include<iostream>
using namespace std;
int T,n;
int main(){
cin>>T;
while(T--){ //T个用例
cin>>n;
int m=n,w=0; //临时变量m,w表示n的位数
while(m){ //m数位分离,计算n的位数
w++; //位数+1
m/=10; //m抹掉个位
}
int k=n,ans=0; //临时变量k,ans表示连乘的结果
while(k){ //数位分离,提取n的每一位
int g=k%10,ji=1;
for(int i=1;i<=w;i++) ji*=g; //变量g连乘w次
k/=10;
ans+=ji; //各位的w次方要累加起来
}
if(ans==n) cout<<"T"<<endl;
else cout<<"F"<<endl;
}
return 0;
}
/*
假设输入的n是w位数字,那么就将n的每一位连乘w次,且累加起来的和正好是n,则是自幂数
*/
/* Problem: 自幂数判断.
Language: C++ Result: 正确 Time: 2026-07-13 19:23:38
User: admin Problem: 4036 contest_id: 0*/
#include<iostream> //枚举因数的范围可以为2~i-1,这样因子数0个的是质数
using namespace std;
int a,b,ans=0;
int main(){
cin>>a>>b;
for(int i=a;i<=b;i++){ //枚举a~b中间的每一个数字i
int cnt=0; //cnt表示i的因数个数
for(int j=2;j<=i-1;j++){ //枚举j:2~i-1
if(i%j==0) cnt++; //j是i的因子,数量+1
}
if(cnt==0) ans++; //因子数为0,则是质数
}
cout<<ans;
return 0;
}
/* Problem: 找素数.
Language: C++ Result: 正确 Time: 2026-07-13 19:14:21
User: admin Problem: 4024 contest_id: 0*/
#include<iostream>
using namespace std;
int a,b,ans=0;
int main(){
cin>>a>>b;
for(int i=a;i<=b;i++){ //枚举a~b中间的每一个数字i
int cnt=0; //cnt表示i的因数个数
for(int j=1;j<=i;j++){ //枚举i所有可能的因数j:1~i
if(i%j==0) cnt++; //j是i的因子,数量+1
}
if(cnt==2) ans++; //因子数为2,则是质数
}
cout<<ans;
return 0;
}
/* Problem: 找素数.
Language: C++ Result: 正确 Time: 2026-07-13 19:12:25
User: admin Problem: 4024 contest_id: 0*/
#include<iostream>
using namespace std;
int n,x,y,ans=0;
int main(){
cin>>n>>x>>y;
for(int i=1;i<=n/x;i++){
for(int j=1;j<=n/y;j++){
if(i+j>50 && i*x+j*y==n){
cout<<i<<" "<<j<<endl;
}
}
}
return 0;
}
/* Problem: 开学采购
Language: C++ Result: 正确 Time: 2026-07-13 19:07:57
User: admin Problem: 3229 contest_id: 0*/
#include<iostream>
using namespace std;
int n,x,y,ans=0;
int main(){
cin>>n>>x>>y;
for(int i=1;i<=n/x;i++){ //枚举霸王龙的数量
for(int j=1;j<=i;j++){ //枚举三角龙的数量,三角龙<=霸王龙
if(i+j>=5 && i*x+j*y==n){//总数要在5个或者5个以上,而且不能有钱剩下
cout<<i<<" "<<j<<endl;
}
}
}
return 0;
}
/* Problem: 恐龙园买玩具
Language: C++ Result: 正确 Time: 2026-07-13 19:00:57
User: admin Problem: 3227 contest_id: 0*/
#include<iostream>
using namespace std;
int x,n,ans=0;
int main(){
cin>>x>>n;
for(int i=1;i<=n;i++){ //循环n次
if(x%7==6 || x%7==0){
//周末不游泳
}else{
ans+=250; //一天游泳250公里
}
x++; //时间+1天
}
cout<<ans;
return 0;
}
/* Problem: 小鱼的航程
Language: C++ Result: 正确 Time: 2026-07-13 18:55:33
User: admin Problem: 3301 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int x=i,d=1; //第i行的初始值是i
for(int j=1;j<=n;j++){
printf("%3d",x);
if(x==n) d=-1;
x+=d; //相邻两个数字差d
}
cout<<endl;
}
return 0;
}
/* Problem: 斜角II
Language: C++ Result: 正确 Time: 2026-07-13 18:48:03
User: admin Problem: 3097 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int x=i; //第i行的初始值是i
for(int j=1;j<=n;j++){
printf("%3d",x);
x++; //相邻两个数字差1
}
cout<<endl;
}
return 0;
}
/* Problem: 斜角I
Language: C++ Result: 正确 Time: 2026-07-13 18:46:51
User: admin Problem: 3096 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i+j==n+1) printf("%3d",1); //反对角线,行号+列号==n+1
else printf("%3d",0);
}
cout<<endl;
}
return 0;
}
/* Problem: 对角线II
Language: C++ Result: 正确 Time: 2026-07-13 18:45:18
User: admin Problem: 3095 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) printf("%3d",1); //对角线,行号==列号
else printf("%3d",0);
}
cout<<endl;
}
return 0;
}
/* Problem: 对角线I
Language: C++ Result: 正确 Time: 2026-07-13 18:43:18
User: admin Problem: 3094 contest_id: 0*/
#include<iostream>
using namespace std;
int ans=0;
double n,d=2; //刚开始第一次可以有2米
int main(){
cin>>n;
while(n>0){
ans++; //换气一次
n-=d; //游出d米
d*=0.98; //更新d,为下一轮使用d做准备
}
cout<<ans;
return 0;
}
/* Problem: 学游泳
Language: C++ Result: 正确 Time: 2026-07-12 20:38:39
User: admin Problem: 3293 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
cin>>n;
n*=10; //元变成角
for(int i=1;i<=n/8;i++){ //枚举圆珠笔的数量
for(int j=1;j<=n/2;j++){ //枚举铅笔的数量
int k=n-i*8-j*2; //铅笔芯的数量
if(k>0&&i+j+k>30){ //铅笔芯至少1个,且三种物品总个数>30
ans++; //满足所有条件,方案数+1
}
}
}
cout<<ans;
return 0;
}
/* Problem: 购买文具
Language: C++ Result: 正确 Time: 2026-07-12 20:32:04
User: admin Problem: 3027 contest_id: 0*/
#include<iostream>
using namespace std;
int ans=0;
int main(){
for(int i=1;i<=20;i++){ //枚举5元的张数
for(int j=1;j<=100;j++){ //枚举1元的张数
int k=100-i*5-j; //计算0.5元的总钱数
if(k>0&&2*k+j+i==100){ //总张数为100,且k>0
//cout<<i<<" "<<j<<" "<<2*k<<endl; //输出可行方案
ans++; //方案数+1
}
}
}
cout<<ans;
return 0;
}
/* Problem: 换零钱1
Language: C++ Result: 正确 Time: 2026-07-12 20:24:49
User: admin Problem: 3782 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=n;i>=1;i--){
cout<<"**";
for(int j=1;j<=i;j++) cout<<' '; //i列,有i个空格
for(int j=1;j<=i;j++) cout<<'*'; //i列,有i个*
cout<<endl;
}
cout<<"***"<<endl; //中间3个*
for(int i=1;i<=n;i++){
cout<<"**";
for(int j=1;j<=i;j++) cout<<' '; //i列,有i个空格
for(int j=1;j<=i;j++) cout<<'*'; //i列,有i个*
cout<<endl;
}
return 0;
}
/* Problem: 打印K型.
Language: C++ Result: 正确 Time: 2026-07-12 20:07:13
User: admin Problem: 1979 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){//规则1
if(j==1 || j==n){
cout<<"|";
}else if(i==(n+1)/2){//规则2
cout<<"-";
}else{
cout<<"a";
}
}
cout<<endl; //每行结束,记得换行
}
return 0;
}
/*
n行n列
规则1 第1列和第n列都是 |
规则2 除了规则1之外,中间行 (n+1)/2 行 都是 -
规则3 除了规则1和规则2之外,都是字符a
*/
/* Problem: ⼩杨的 H 字矩阵.
Language: C++ Result: 正确 Time: 2026-07-12 19:59:57
User: admin Problem: 4047 contest_id: 0*/
#include<iostream>
using namespace std;
int a,b,m,n,ans=0;
int main(){
cin>>a>>b>>m>>n;
ans+=a+b; //第1天和第2天的题目
for(int i=3;i<=n;i++){ //3~n天
int t=a+b;
ans+=t; //第i天的题目
if(t>=m) break;
a=b; //为下一轮的i准备:更新第i-2天
b=t; //为下一轮的i准备:更新第i-1天
}
cout<<ans;
return 0;
}
/* Problem: 小杨做题.
Language: C++ Result: 正确 Time: 2026-07-12 19:50:26
User: admin Problem: 4046 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int x=i,d=0;
for(int j=1;j<=n;j++){
printf("%3d",x);
if(i+j==n+1) d=-1; //反对角线以后,d为-1
x+=d; //为下一轮准备
}
cout<<endl;
}
return 0;
}
/* Problem: 拐角V
Language: C++ Result: 正确 Time: 2026-07-12 19:36:52
User: admin Problem: 3113 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int x=i,d=0;
for(int j=1;j<=n;j++){
printf("%3d",x);
if(i==j) d=1;
x+=d; //为下一轮准备
}
cout<<endl;
}
return 0;
}
/* Problem: 拐角IV
Language: C++ Result: 正确 Time: 2026-07-12 19:33:09
User: admin Problem: 3112 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int x=n,d=-1;
for(int j=1;j<=n;j++){
printf("%3d",x);
if(i==j) d=0;
x+=d; //为下一轮准备
}
cout<<endl;
}
return 0;
}
/* Problem: 拐角III
Language: C++ Result: 正确 Time: 2026-07-12 19:29:21
User: admin Problem: 3102 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){//1~n行
int x=n-i+1,d=0; //x表示第i行的初始值,d表示第i行的变化值
for(int j=1;j<=n;j++){
printf("%3d",x);
if(j==i) d=-1; //列号和行号相等时,d变成-1
x+=d; //+d,为下一列准备
}
cout<<endl;
}
return 0;
}
/* Problem: 拐角II
Language: C++ Result: 正确 Time: 2026-07-12 19:22:55
User: admin Problem: 3101 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){//1~n行
int x=1,d=1; //x表示第i行的初始值,d表示第i行的变化值
for(int j=1;j<=n;j++){
printf("%3d",x);
if(x==i) d=0; //当第j列的值变成i时,d变成0
x+=d; //+d,为下一列准备
}
cout<<endl;
}
return 0;
}
/*
1 确定行号:1~n
2 确定每一行的开头:第i行以1开头
3 确定相邻两列的变化规律:d初始为1,当第j列的值变成i时,d变成0
*/
/* Problem: 拐角I
Language: C++ Result: 正确 Time: 2026-07-12 19:15:45
User: admin Problem: 3100 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
cin>>n;
for(int i=n;i>=1;i--){//看成n~1行
int x=i,d=1; //x表示第i行的初始值,d表示第i行的变化值
for(int j=1;j<=n;j++){
printf("%3d",x);
if(x==n) d=-1; //d初始为1,遇到n变成-1
x+=d; //+d,为下一列准备
}
cout<<endl;
}
return 0;
}
/*
n行(看成n~1行)n列,每一行都有n列:
第i行以i开头
初始时,第j+1列比第j列+1,如果遇到了n,第j+1列比第j列-1 .
所以,用一个变量d纪录这个变化值,第j+1列比第j列+d。d初始为1,遇到n变成-1
*/
/* Problem: 斜角IV
Language: C++ Result: 正确 Time: 2026-07-12 19:07:02
User: admin Problem: 3099 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){//i表示1~n行
char c='A'+i-1; //第i行的开头
for(int j=1;j<=n;j++){ //每一行都有n列,也就是第i行都是n列
printf("%3c",c);
c++; //+1,为下一列准备
if(c=='A'+n) c='A'; //超过输出范围,改回'A'
}
printf("\n"); //内层循环结束后,换行
}
return 0;
}
/*
n行n列,每一行都有n列:
第1行 A开头
第2行 B开头
..
第n行 char('A'+n-1) 开头 总结:第i行应该以 char('A'+i-1)开头
第j+1列比第j列 +1 ,如果第j列已经到了 最后一个字母,应该重新从'A'开始
*/
/* Problem: 斜角III
Language: C++ Result: 正确 Time: 2026-07-12 18:55:14
User: admin Problem: 3098 contest_id: 0*/
#include<iostream>
using namespace std;
int x,n=0,ans=0;
int main(){
while(cin>>x){ //在循环条件中,进行输入,表示无限输入
n++; //个数+1
ans+=x; //求和
}
cout<<n<<" "<<ans;
return 0;
}
/*
注意:这种循环输入需要按ctrl+z,然后回车,才能结束循环
*/
/* Problem: 钱币
Language: C++ Result: 正确 Time: 2026-07-11 20:00:41
User: admin Problem: 3700 contest_id: 0*/
#include<iostream>
using namespace std;
long long t,n,a[100010],f[100010];//f[i]表示1~i的奶酪的美味度之和最大值
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
f[1]=max(a[1],0ll); //状态初始值
for(int i=2;i<=n;i++){
f[i]=max(f[i-1],f[i-2]+a[i]); //两种情况取最大值:第i个奶酪 吃 或 不吃
}
cout<<f[n]<<endl;
}
return 0;
}
/* Problem: 吃奶酪
Language: C++ Result: 正确 Time: 2026-07-11 17:08:22
User: admin Problem: 2302 contest_id: 0*/
#include<iostream>
using namespace std;
int n,m,a[1000010],b[1000010],ans=0;//a原始数组,b差分数组
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
b[x]++;
b[y+1]--;
}
for(int i=1;i<=n;i++){ //计算b的前缀和a
a[i]=a[i-1]+b[i];
if(a[i]%2){ //被翻面次数为奇数,则是正面
ans++;
}
}
cout<<ans;
return 0;
}
/* Problem: 小 X 与煎饼达人
Language: C++ Result: 正确 Time: 2026-07-11 16:36:43
User: admin Problem: 1464 contest_id: 0*/
#include<iostream>
using namespace std;
int n,k,a[100010],b[100010];//b是a的差分数组
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i]-a[i-1]; //计算差分数组b
}
for(int i=1;i<=k;i++){ //k轮区间修改
int l,r,x;
cin>>l>>r>>x;
b[l]+=x;
b[r+1]-=x;
}
for(int i=1;i<=n;i++){ //计算b的前缀和
a[i]=a[i-1]+b[i]; //b的前缀和
cout<<a[i]<<" ";
}
return 0;
}
/*差分:解决区间修改的问题
*/
/* Problem: 倒水
Language: C++ Result: 正确 Time: 2026-07-11 16:25:08
User: admin Problem: 1276 contest_id: 0*/
#include<iostream>
#include<queue>
using namespace std;
int n,ans=0;
deque<int> q;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int ty,x;
cin>>ty>>x;
if(ty==1){ //入队
q.push_back(x); //从队尾入队
}else{ //出队
if(x==0) q.pop_front(); //从队头出
else q.pop_back(); //从队尾出
}
}
if(q.empty()) cout<<"NULL";
while(q.size()){
cout<<q.front()<<" "; //获得队头
q.pop_front(); //队头出队
}
return 0;
}
/* Problem: 双端队列
Language: C++ Result: 正确 Time: 2026-07-11 15:51:13
User: admin Problem: 2412 contest_id: 0*/
#include<iostream>
using namespace std;
string s1;
int n,a[100010],b,c[100010];//a被除数,b除数,c商
int main(){
cin>>s1>>b;
for(int i=s1.size()-1,j=1;i>=0;i--,j++) a[j]=s1[i]-'0'; //字符转数字,从低位到高位逐位存储
int len=s1.size();
int x=0; //用于拼接每一次做除法的被除数
for(int i=len;i>=1;i--){ //从前往后遍历被除数
x=x*10+a[i]; //拼接被除数
c[i]=x/b; //上商,x<b商为0,否则商为x/b
x%=b; //商后的余数
}
while(c[len]==0&&len>1) len--;
for(int i=len;i>=1;i--) cout<<c[i];
return 0;
}
/* Problem: 高精度除以低精
Language: C++ Result: 正确 Time: 2026-07-11 15:39:08
User: admin Problem: 1215 contest_id: 0*/
#include<iostream>
using namespace std;
int c[1010];
void f(int a[],int b[]){ //a被减数,b减数,0下标分别存储数字长度
int len=a[0]; //被减数的长度
for(int i=1;i<=len;i++){
c[i]=a[i]-b[i];
if(c[i]<0){ //需要借位
a[i+1]--;
c[i]+=10;
}
}
while(c[len]==0&&len>1) len--;
for(int i=len;i>=1;i--) cout<<c[i];
}
string s1,s2;
int a[1010],b[1010];
int main(){
cin>>s1>>s2;
a[0]=s1.size();b[0]=s2.size();
for(int i=a[0]-1,j=1;i>=0;i--,j++) a[j]=s1[i]-'0'; //字符转数字,从低位到高位逐位存储
for(int i=b[0]-1,j=1;i>=0;i--,j++) b[j]=s2[i]-'0'; //字符转数字,从低位到高位逐位存储
if(b[0]>a[0]){ //减数更长,则更大
cout<<"-", f(b,a);
}else if(b[0]==a[0]){ //长度一样
if(s1>s2) f(a,b);
else if(s1==s2) cout<<0;
else cout<<"-", f(b,a);
}else{
f(a,b);
}
return 0;
}
/* Problem: 高精减A-B
Language: C++ Result: 正确 Time: 2026-07-11 15:16:28
User: admin Problem: 1210 contest_id: 0*/
#include<iostream>
using namespace std;
string s1,s2;
int n,a[100010],b[100010],c[100010];
int main(){
cin>>s1>>s2;
for(int i=s1.size()-1,j=1;i>=0;i--,j++) a[j]=s1[i]-'0'; //字符转数字,从低位到高位逐位存储
for(int i=s2.size()-1,j=1;i>=0;i--,j++) b[j]=s2[i]-'0'; //字符转数字,从低位到高位逐位存储
int len1=s1.size(),len2=s2.size();
for(int i=1;i<=len1;i++){ //从低位到高位,遍历a的每一位
for(int j=1;j<=len2;j++){ //从低位到高位,遍历b的每一位
c[i+j-1]+=a[i]*b[j];
}
}
for(int i=1;i<=10010;i++){ //从低位到高位,进位
c[i+1]+=c[i]/10; //进位
c[i]%=10; //留下最低位
}
int len=10010;
while(c[len]==0&&len>1) len--; //去掉前导0
for(int i=len;i>=1;i--) cout<<c[i];
return 0;
}
/*
1 用字符串读入,然后倒序存储到数组中
2 数组从前往后,逐位相加,并进位
*/
/* Problem: 高精乘低精A×B
Language: C++ Result: 正确 Time: 2026-07-11 14:48:04
User: admin Problem: 1211 contest_id: 0*/
#include<iostream>
using namespace std;
string s1,s2;
int n,a[100010],b[100010],c[100010];
int main(){
cin>>s1>>s2;
for(int i=s1.size()-1,j=1;i>=0;i--,j++) a[j]=s1[i]-'0'; //字符转数字,从低位到高位逐位存储
for(int i=s2.size()-1,j=1;i>=0;i--,j++) b[j]=s2[i]-'0'; //字符转数字,从低位到高位逐位存储
int len1=s1.size(),len2=s2.size();
for(int i=1;i<=len1;i++){ //从低位到高位,遍历a的每一位
for(int j=1;j<=len2;j++){ //从低位到高位,遍历b的每一位
c[i+j-1]+=a[i]*b[j];
}
}
for(int i=1;i<=10010;i++){ //从低位到高位,进位
c[i+1]+=c[i]/10; //进位
c[i]%=10; //留下最低位
}
int len=10010;
while(c[len]==0&&len>1) len--; //去掉前导0
for(int i=len;i>=1;i--) cout<<c[i];
return 0;
}
/*
1 用字符串读入,然后倒序存储到数组中
2 数组从前往后,逐位相加,并进位
*/
/* Problem: 高精乘高精A×B
Language: C++ Result: 正确 Time: 2026-07-11 14:46:20
User: admin Problem: 1212 contest_id: 0*/
#include<iostream>
using namespace std;
string s1,s2;
int n,a[1010],b[1010],c[1010];
int main(){
cin>>s1>>s2;
for(int i=s1.size()-1,j=1;i>=0;i--,j++) a[j]=s1[i]-'0'; //字符转数字,从低位到高位逐位存储
for(int i=s2.size()-1,j=1;i>=0;i--,j++) b[j]=s2[i]-'0'; //字符转数字,从低位到高位逐位存储
for(int i=1;i<=max(s1.size(),s2.size());i++){ //模拟竖式加法,从低位到高位
c[i]+=a[i]+b[i]; //注意
c[i+1]+=c[i]/10; //进位
c[i]%=10; //进位后,当前为只留下个位
}
int len=201;
while(c[len]==0&&len>1) len--; //去掉前导0
for(int i=len;i>=1;i--) cout<<c[i];
return 0;
}
/*
1 用字符串读入,然后倒序存储到数组中
2 数组从前往后,逐位相加,并进位
*/
/* Problem: 高精和A+B
Language: C++ Result: 正确 Time: 2026-07-11 14:18:44
User: admin Problem: 1209 contest_id: 0*/
#include<iostream>
using namespace std;
string s1,s2;
int n,a[1010],b[1010],c[1010];
int main(){
cin>>s1>>s2;
for(int i=s1.size()-1,j=1;i>=0;i--,j++) a[j]=s1[i]-'0'; //字符转数字,从低位到高位逐位存储
for(int i=s2.size()-1,j=1;i>=0;i--,j++) b[j]=s2[i]-'0'; //字符转数字,从低位到高位逐位存储
for(int i=1;i<=max(s1.size(),s2.size());i++){ //模拟竖式加法,从低位到高位
c[i]+=a[i]+b[i]; //注意
c[i+1]+=c[i]/10; //进位
c[i]%=10; //进位后,当前为只留下个位
}
int len=201;
while(c[len]==0) len--; //去掉前导0
for(int i=len;i>=1;i--) cout<<c[i];
return 0;
}
/*
1 用字符串读入,然后倒序存储到数组中
2 数组从前往后,逐位相加,并进位
*/
/* Problem: 高精和A+B
Language: C++ Result: 正确 Time: 2026-07-11 14:17:43
User: admin Problem: 1209 contest_id: 0*/
#include<iostream>
#include<iomanip>
using namespace std;
double x,ans=0;
int main(){
for(int i=1;i<=12;i++){
cin>>x; //第i个月的工资收入
if(x>800){ //不超过800是不用交税的
ans+=(x-800)*0.2;
}
}
cout<<setprecision(2)<<fixed<<ans;
return 0;
}
/* Problem: 交税
Language: C++ Result: 正确 Time: 2026-07-10 20:29:26
User: admin Problem: 4888 contest_id: 0*/
#include<iostream> //解法3
using namespace std;
int ab,ac,cb1,cb2;
int main(){
cin>>ab>>ac>>cb1>>cb2;
//三个数字里面取最小值
cout<<min(ab,min(ac+cb1,ac+cb2));
return 0;
}
/* Problem: 去旅行
Language: C++ Result: 正确 Time: 2026-07-10 20:21:31
User: admin Problem: 4887 contest_id: 0*/
#include<iostream> //解法2
using namespace std;
int ab,ac,cb1,cb2;
int main(){
cin>>ab>>ac>>cb1>>cb2;
int ab1=ac+cb1;
int ab2=ac+cb2;
//三个数字里面取最小值
int mn=ab; //假设ab最小,打擂台
if(ab1<mn) mn=ab1;
if(ab2<mn) mn=ab2;
cout<<mn;
return 0;
}
/* Problem: 去旅行
Language: C++ Result: 正确 Time: 2026-07-10 20:19:05
User: admin Problem: 4887 contest_id: 0*/
#include<iostream>
using namespace std;
int ab,ac,cb1,cb2;
int main(){
cin>>ab>>ac>>cb1>>cb2;
int ab1=ac+cb1;
int ab2=ac+cb2;
//三个数字里面取最小值
if(ab<=ab1&&ab<=ab2){
cout<<ab;
}else if(ab1<=ab&&ab1<=ab2){
cout<<ab1;
}else{
cout<<ab2;
}
return 0;
}
/* Problem: 去旅行
Language: C++ Result: 正确 Time: 2026-07-10 20:17:34
User: admin Problem: 4887 contest_id: 0*/
#include<iostream>
using namespace std;
typedef long long ll;
ll l,n,m,ans=0,a[100010];
bool check(int x){ //最短距离x的情况下,移走石头数量是否满足要求
int cnt=0,s=0; //s表示左端点的最新值
for(int i=1;i<=n+1;i++){ //遍历每一块石头
if(a[i]-a[s]<x) cnt++; //跳跃距离不够x,移走i
else s=i; //更新左端点的最新值
}
return cnt<=m; //移走的石头不超过m块
}
int main(){
cin>>l>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
a[0]=0,a[n+1]=l; //第1块和最后1块的位置
int L=1,R=l;
while(L<=R){
ll mid=(L+R)/2;
if(check(mid)){ //可行,则答案可能可以更大
ans=mid;
L=mid+1;
}else{ //不可行,则答案只能更小
R=mid-1;
}
}
cout<<ans;
return 0;
}
/*
二分:最短距离,在当前距离下,移走的石头数量是否<=m
如果移走的石头满足要求,答案可能可以更大,左指针右移
如果移走的石头>m,答案只能更小,右指针左移
*/
/* Problem: 跳石头
Language: C++ Result: 正确 Time: 2026-07-10 17:40:40
User: admin Problem: 2069 contest_id: 0*/
#include<iostream>
using namespace std;
int n,s[10],a[25],ans=0;
int main(){
for(int i=1;i<=4;i++) cin>>s[i]; //科目1~科目4的题目数量
for(int t=1;t<=4;t++){ //科目1~科目4
int sum=0;
for(int i=1;i<=s[t];i++){ //输入科目t的每道题的时间
cin>>a[i];
sum+=a[i]; //做题总时间
}
int u=1<<s[t],res=sum;
for(int i=0;i<u;i++){ //子集枚举
int left=0; //算一边就可以了
for(int j=0;j<s[t];j++){
if(i&(1<<j)) left+=a[j];
}
int right=sum-left; //另一边
res=min(res,max(left,right)); //计算该科目花费的最小时间
}
ans+=res; //计算所有科目花费的总时间
}
cout<<ans;
return 0;
}
/*
对于某个科目而言,就是怎么均衡分配的问题 :
用子集枚举,1表示左脑在做,0表示右脑在做,那么可以用 0~2^s[t]-1来表示所有的做题方案。
对于每一个做题方案,取左脑的时间和 与 右脑的时间和 的差值绝对值的最小值,
当差值绝对值的最小时,即max(左脑的时间和,右脑的时间和)完成该科目的最少时间
*/
/* Problem: 考前临时抱佛脚
Language: C++ Result: 正确 Time: 2026-07-10 16:56:03
User: admin Problem: 2346 contest_id: 0*/
#include<iostream>
#include<cmath>
using namespace std;
int n,a[20],ans=0,f[10010][15];//ans表示方案数,f[i]记录第i种方案
int main(){
cin>>n;
for(int i=1;i<=10;i++) a[i]=1; //三进制的最小数字,每种配料至少用1克
for(int i=1;i<=pow(3,10);i++){
for(int j=1;j<=10;j++){ //从低位到高位处理三进制数字的进位
if(a[j]==4){ //第j位需要进位
a[j+1]++; //高位+1
a[j]=1;
}
} //循环结束,得到一个完美的三进制数字(枚举的可能方案)
int cnt=0;
for(int j=1;j<=10;j++) cnt+=a[j]; //计算配料总质量
if(cnt==n){ //正好是答案
ans++; //方案数+1
for(int j=1;j<=10;j++) f[ans][j]=a[j]; //记录当前合法方案
}
a[1]++; //准备下一个三进制数字
}
cout<<ans<<endl;
for(int i=1;i<=ans;i++){ //循环输出ans种方案
for(int j=10;j>=1;j--) cout<<f[i][j]<<" "; //从高位到低位输出方案
cout<<endl;
}
return 0;
}
/* Problem: 烤乳猪
Language: C++ Result: 正确 Time: 2026-07-10 16:23:21
User: admin Problem: 2324 contest_id: 0*/
#include<iostream>
using namespace std;
typedef long long ll;
ll n,m,a[1000010],ans=-1,l=0,r=0;
ll check(ll x){ //锯片高度为x,带走的木材数量
ll cnt=0;
for(int i=1;i<=n;i++){
if(a[i]>x) cnt+=a[i]-x; //树比锯片高,才能带走木材
}
return cnt;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
r=max(r,a[i]); //最高高度
}
while(l<=r){
ll mid=(l+r)/2;
if(check(mid)>=m){ //够吗
ans=mid; //锯片最高的合法高度,带走木材尽可能刚刚达到m的要求,没有浪费
l=mid+1;
}else{
r=mid-1;
}
}
cout<<ans;
return 0;
}
/*
所求答案在一个明显的单调区间上,
*/
/* Problem: 伐木工人
Language: C++ Result: 正确 Time: 2026-07-10 15:53:17
User: admin Problem: 2392 contest_id: 0*/
#include<iostream>
using namespace std;
int n,a[100010],q,x;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&q);
while(q--){ //q轮询问
scanf("%d",&x);
int l=1,r=n,ans=-1; //ans是本轮查找的答案
while(l<=r){
int mid=l+(r-l)/2; //等价于(l+r)/2; 这种可以避免r过大时,l+r数据溢出
if(x>a[mid]){ //答案在右边
l=mid+1;
}else{
ans=mid; //从左到右,第一个>=x的位置的下标
r=mid-1;
}
}
if(a[ans]==x) printf("%d ",ans);
else printf("-1 ");
}
return 0;
}
/* Problem: 二分查找左边界
Language: C++ Result: 正确 Time: 2026-07-10 15:39:06
User: admin Problem: 1231 contest_id: 0*/
#include<iostream>
using namespace std;
int n,a[100010],q,x;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&q);
while(q--){
scanf("%d",&x);
int l=1,r=n,flag=0; //flag表示是否找到
while(l<=r){
int mid=l+(r-l)/2; //等价于(l+r)/2; 这种可以避免r过大时,l+r数据溢出
if(x==a[mid]){ //正好找到
printf("%d\n",mid);
flag=1; //找到了,标记为1
break;
}else if(x>a[mid]){ //答案在右边
l=mid+1;
}else{ //答案在左边
r=mid-1;
}
}
if(!flag) printf("-1\n"); //循环结束,没有找到x,标记仍然为0
}
return 0;
}
/* Problem: 二分查找
Language: C++ Result: 正确 Time: 2026-07-10 15:08:12
User: admin Problem: 1200 contest_id: 0*/
#include<iostream>
using namespace std;
string s;
int n;
int main(){
cin>>s>>n; //在s中删掉n位数字
while(n--){
int i=0; //从前往后找数字,该数字是第一个升序的末尾数字
while(s[i]<=s[i+1]) i++; //i到了第一个升序的末尾
s.erase(i,1);
}
while(s[0]=='0'&&s.size()>1) s.erase(0,1); //去掉数字的前导0
cout<<s;
return 0;
}
/* Problem: 删数问题
Language: C++ Result: 正确 Time: 2026-07-10 14:39:22
User: admin Problem: 1259 contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,ans=0,last=-1; //last表示前面已经选择的最后一个右端点
struct node{
int l,r;
}a[10010];
bool cmp(node n1,node n2){
return n1.r<n2.r; //按照右端点从小到大排序
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].l>>a[i].r;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
if(a[i].l>last){ //第i个区间不包含last
ans++; //增加一个选点
last=a[i].r; //更新最后一个选点
}
}
cout<<ans;
return 0;
}
/*贪心策略:
1 按照右端点从小到大排序
2 从第1个区间开始选点:右端点r;如果第2个区间包含右端点,直接过掉,...,
过到第i个区间不再包含r,需要新增加一个选点:第i个区间的右端点,...
*/
/* Problem: 区间选点
Language: C++ Result: 正确 Time: 2026-07-10 14:15:05
User: admin Problem: 1706 contest_id: 0*/
#include<iostream>
#include<cmath>
using namespace std;
int n,cnt=0,a[15],ans[10000][15];//a[i]表示第i种配料的质量
int main(){
cin>>n;
for(int i=1;i<=10;i++) a[i]=1; //初始化每一种配料质量为1
for(int i=1;i<=pow(3,10);i++){//1~3^10
for(int j=1;j<=10;j++){
if(a[j]==4){
a[j+1]++;//向j+1位置进位1
a[j]=1; //当前位置归1
}
}
int ret=0;
for(int j=1;j<=10;j++) ret+=a[j]; //累加每一位每一种配套的质量
if(ret==n){ //恰好是需要的美味度n
cnt++; //方案数+1
for(int j=1;j<=10;j++) ans[cnt][j]=a[j];//记录第cnt种方案
}
a[1]++;
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++){
for(int j=10;j>=1;j--) cout<<ans[i][j]<<' ';//字典序输出
cout<<endl;
}
return 0;
}
/* Problem: 烤乳猪
Language: C++ Result: 正确 Time: 2026-07-10 10:09:27
User: admin Problem: 2324 contest_id: 0*/
#include<iostream>
using namespace std;
int n,a,b,aa=0,bb=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){//循环n次
cin>>a>>b; //出拳
if(a==b){ //平局
aa+=1; //各得1分
bb+=1;
}else if(a==0&&b==1 || a==1&&b==2 || a==2&&b==0){ //a赢了,b输了
aa+=2; //a得2分,b不得分
}else{ //a输了,b赢了
bb+=2; //b得2分,a不得分
}
}
cout<<aa<<" "<<bb;
return 0;
}
/*
6
0 1
2 2
0 2
0 1
2 2
1 2
*/
/* Problem: 石头剪刀布
Language: C++ Result: 正确 Time: 2026-07-09 20:37:26
User: admin Problem: 4115 contest_id: 0*/
#include<iostream>
using namespace std;
int m,d;
int main(){
scanf("%d %d",&m,&d); //注意点:变量前面需要取地址符&
//%2d整数宽度为2,%02d宽度为2,不足2则前面补0
printf("%02d-%02d",m,d);
return 0;
}
/* Problem: 日期输出
Language: C++ Result: 正确 Time: 2026-07-09 20:29:40
User: admin Problem: 2955 contest_id: 0*/
#include<iostream>
using namespace std;
int m,d;
int main(){
cin>>m>>d;
if(m<10) cout<<0<<m; //不足两位,则补0
else cout<<m;
cout<<"-";
if(d<10) cout<<0<<d; //不足两位,则补0
else cout<<d;
return 0;
}
/* Problem: 日期输出
Language: C++ Result: 正确 Time: 2026-07-09 20:26:24
User: admin Problem: 2955 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){ //循环n次
int x; cin>>x; //在循环中输入数字x
if(x%10<=4) cout<<x-x%10<<endl; //n的个位如果是0~4,则直接减掉
else cout<<x-x%10+10<<endl;
}
return 0;
}
/*
输入数字n
n的个位如果是0~4,则直接减掉
n的个位如果是5~9,则减掉个位且+10
*/
/* Problem: 四舍五入.
Language: C++ Result: 正确 Time: 2026-07-09 19:51:19
User: admin Problem: 4353 contest_id: 0*/
#include<iostream>
using namespace std;
int n,x,y;
int main(){
cin>>n>>x>>y;
if(y%x==0){ //正好吃光 y/x 本
cout<<n-y/x;
}else{//吃光 y/x 本 ,还有 1本书没啃完
cout<<n-y/x-1;
}
return 0;
}
/* Problem: 图书馆里的老鼠.
Language: C++ Result: 正确 Time: 2026-07-09 19:44:59
User: admin Problem: 4352 contest_id: 0*/
#include<iostream>
using namespace std;
double n;
int main(){
cin>>n; //距离
double a=n/1.2; //走路的时间
double b=n/3.0+50; //骑车的时间
if(a<b){ //走路快
cout<<"Walk";
}else if(b<a){ //骑车快
cout<<"Bike";
}else{
cout<<"ALL";
}
return 0;
}
/* Problem: 骑车与走路
Language: C++ Result: 正确 Time: 2026-07-09 19:27:24
User: admin Problem: 1621 contest_id: 0*/
#include<iostream>
using namespace std;
int a,b;
int main(){
cin>>a>>b; //输入幸运、鼓励
if(a>=10 || b>=20){//10个“幸运”、或20个“鼓励”
cout<<1;
}else{
cout<<0;
}
return 0;
}
/* Problem: 收集瓶盖赢大奖
Language: C++ Result: 正确 Time: 2026-07-09 19:18:42
User: admin Problem: 1619 contest_id: 0*/
#include<iostream>
#include<climits>
using namespace std;
int n,ans=INT_MAX,s[20],k[20];
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i]>>k[i];
for(int i=1;i<=(1<<n)-1;i++){ //子集枚举 1~2^n-1
int ss=1,kk=0; //当前这种选择方案的酸度积ss,苦度和kk
for(int j=0;j<n;j++){
if(i&(1<<j)){ //判断i的第j位是否是1,是1就表示选择配料编号j+1
ss*=s[j+1];
kk+=k[j+1];
}
}
ans=min(ans,abs(ss-kk)); //酸度和与苦度和的差值绝对值,取最小
}
cout<<ans;
return 0;
}
/* Problem: PERKET
Language: C++ Result: 正确 Time: 2026-07-09 17:57:22
User: admin Problem: 2347 contest_id: 0*/
#include<iostream>
#include<stack>
using namespace std;
string s[1010];
int k=0;
stack<double> st; //浮点数
int main(){
while(cin>>s[++k]){} //输入
for(int i=k;i>=1;i--){ //从后往前遍历
if(s[i][0]=='+'){
double x=st.top();st.pop();
double y=st.top();st.pop();
st.push(x+y);
}else if(s[i][0]=='-'){
double x=st.top();st.pop();
double y=st.top();st.pop();
st.push(x-y);
}else if(s[i][0]=='*'){
double x=st.top();st.pop();
double y=st.top();st.pop();
st.push(x*y);
}else if(s[i][0]=='/'){
double x=st.top();st.pop();
double y=st.top();st.pop();
st.push(x/y);
}else if(s[i][0]>='0'&&s[i][0]<='9'){ //碰到数字入栈
double x=stof(s[i]); //字符串转浮点数
st.push(x);
}
}
printf("%.2lf",st.top());
return 0;
}
/*
前缀表达式计算:从后往前遍历,碰到数字入栈,碰到符号取出栈顶和次顶计算,然后结果入栈
*/
/* Problem: 波兰表达式
Language: C++ Result: 正确 Time: 2026-07-09 17:23:04
User: admin Problem: 1909 contest_id: 0*/
#include<iostream>
#include<queue>
using namespace std;
int n,ans=0;
string s[110];
queue<string> q[10];
//第一轮:q[1]~q[9]存放数字1~9的扑克
//第二轮:q[1]~q[4]依次存放A~D的扑克
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=n;i++){ //第一轮:遍历n张扑克,进行第一轮入队
int x=s[i][1]-'0'; //字符转数字
q[x].push(s[i]); //扑克牌入队
}
int k=0; //重新存放数据的编号
for(int i=1;i<=9;i++){ //遍历每一个队列
printf("Queue%d:",i);
while(q[i].size()){ //第i个队列非空,则出队
cout<<q[i].front()<<" ";
s[++k]=q[i].front(); ////出队数据,重新存放到s[]
q[i].pop();
}
cout<<endl;
}
for(int i=1;i<=n;i++){ //第二轮:遍历n张扑克,进行第二轮入队
int x=s[i][0]-'A'+1; //字符转数字 A~1 B~2 C~3 D~4
q[x].push(s[i]); //扑克牌入队
}
k=0; //重新存放数据的编号
for(int i=1;i<=4;i++){ //遍历每一个队列
printf("Queue%c:",i+'A'-1);
while(q[i].size()){ //第i个队列非空,则出队
cout<<q[i].front()<<" ";
s[++k]=q[i].front(); ////出队数据,重新存放到s[]
q[i].pop();
}
cout<<endl;
}
for(int i=1;i<=n;i++) cout<<s[i]<<" "; //排序结果
return 0;
}
/* Problem: 扑克牌排序
Language: C++ Result: 正确 Time: 2026-07-09 16:55:49
User: admin Problem: 2737 contest_id: 0*/
#include<iostream>
#include<queue>
using namespace std;
int m,n,a[110],b[110],x=0;
queue<int> q;
int main(){
cin>>m;
for(int i=1;i<=m;i++){
cin>>a[i]; //0是作弊猴子
q.push(i); //猴子编号依次入队
}
cin>>n;
while(q.size()>1){ //留下一只,是胜利者
x++; //报数
int head=q.front(); //队首元素
q.pop(); //出队
if(x%n==0){ //应该出局
if(a[head]==0){
b[head]++; //作弊次数+1
if(b[head]==1) q.push(head); //只作弊一次,可以回到队尾
}
}else{ //不用出局
q.push(head); //回到队尾
}
}
cout<<q.front();
return 0;
}
/* Problem: 新猴王
Language: C++ Result: 正确 Time: 2026-07-09 16:27:57
User: admin Problem: 1288 contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int l,r; //活动区间
}a[10010];
int n,ans=0,last=-999;
bool cmp(node n1,node n2){
return n1.r<=n2.r; //按照活动的结束时间从小到大排序
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].l>>a[i].r; //输入开始时间,结束时间
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
if(a[i].l>=last){ //始时间>=最后一场活动的结束时间,则可以安排
last=a[i].r; //更新最后一场活动的结束时间
ans++;
}
}
cout<<ans;
return 0;
}
/*
贪心策略:
1 按照活动的结束时间从小到大排序;
2 从前往后遍历活动,让结束时间早的活动,优先安排;
当第i场活动尝试安排时,只要他的开始时间>=最后一场活动的结束时间,则可以安排
*/
/* Problem: 活动选择
Language: C++ Result: 正确 Time: 2026-07-09 15:52:49
User: admin Problem: 1705 contest_id: 0*/
#include<iostream>
using namespace std;
int n,a[110],x=0;//a[i]表示第i套系统能够拦截的高度,x表示目前有x套系统
int main(){
while(cin>>n){
int flag=0; //0表示无法拦截
for(int i=1;i<=x;i++){//从前往后遍历x套系统
if(a[i]>=n){ //可以拦截
a[i]=n; //第i套系统的拦截高度更新为n
flag=1; //标记可以拦截
break;
}
}
if(flag==0) a[++x]=n; //新增一套系统,拦截高度更新为n
}
cout<<x;
return 0;
}
/*
贪心策略:
1、如果之前已经有的系统无法拦截,必须新增系统;
2、如果之前已经有的系统可以拦截,那么应该是从前往后找第一个可以拦截的系统,这样是最优选择。
*/
/* Problem: 导弹拦截问题
Language: C++ Result: 正确 Time: 2026-07-09 15:29:57
User: admin Problem: 1258 contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,ans=0,a[1010],s[210];//s[i]表示第i个水龙头目前的等待时间
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1,k=1;i<=n;i++,k++){ //第i个人,第k个水龙头
if(k==m+1) k=1; //水龙头一共m个
s[k]+=a[i]; //第i个人在第k个水龙头打水
ans+=s[k]; //累加:第i个人花费的总时间
}
cout<<ans;
return 0;
}
/*
贪心策略:将打水时间从小到大排序,让打水时间短的人先打水,这样总时间是最短的
*/
/* Problem: 排队打水
Language: C++ Result: 正确 Time: 2026-07-09 15:14:04
User: admin Problem: 1256 contest_id: 0*/
#include<iostream>
using namespace std;
int n,a[10010]={0,1}; //待备忘录的递归
int f(int n){ //计算n有多少种方案
if(a[n]) return a[n]; //小本本有答案,直接返回
a[n]=1; //默认n本身就是一个解
for(int i=1;i<=n/2;i++){ //大问题分解成小问题
a[n]+=f(i); //子问题的方案数累加
}
return a[n];
}
int main(){
cin>>n;
cout<<f(n);
return 0;
}
/* Problem: 数的计数
Language: C++ Result: 正确 Time: 2026-07-09 15:01:57
User: admin Problem: 1250 contest_id: 0*/
#include<iostream>
#include<stack>
using namespace std;
int n;
stack<int> st;
void f(int x,int B){//递归实现的短除法
if(x==0) return;
st.push(x%B);
f(x/B,B);
}
void turn(int x,int B){//将x转成B进制数
if(x==0){
printf("0(%d)\n",B); return;
}
if(x<0) printf("-"),x=-x;
f(x,B); //递归实现的短除法
while(st.size()){
int x=st.top(); st.pop(); //取出栈顶,并出栈
if(x<=9) cout<<x;
else cout<<char(x-10+'A');
}
printf("(%d)\n",B);
}
int main(){
cin>>n;
turn(n,2);
turn(n,8);
turn(n,16);
return 0;
}
/* Problem: 进制转换
Language: C++ Result: 正确 Time: 2026-07-09 14:28:39
User: admin Problem: 1161 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
void f(int n,char a,char b,char c){
if(n==1){
cout<<a<<"->"<<c<<endl; //直接移动第n个盘子
return;
}
f(n-1,a,c,b);
cout<<a<<"->"<<c<<endl; //直接移动第n个盘子
f(n-1,b,a,c);
}
int main(){
cin>>n;
f(n,'A','B','C');
return 0;
}
/* Problem: 汉诺塔
Language: C++ Result: 正确 Time: 2026-07-09 14:16:03
User: admin Problem: 1246 contest_id: 0*/
#include<iostream>
using namespace std;
int x,n,ans=0;
int main(){
while(scanf("%d",&x)!=EOF){
n++; //统计个数
ans+=x; //统计总价值
}
printf("%d\n%d",n,ans);
return 0;
}
/* Problem: 钱币
Language: C++ Result: 正确 Time: 2026-07-09 09:42:15
User: admin Problem: 3700 contest_id: 0*/
#include<iostream>
using namespace std;
int x,n,ans=0;
int main(){
while(scanf("%d",&x)!=EOF){
n++; //统计个数
ans+=x; //统计总价值
}
printf("%d\n%d",n,ans);
return 0;
}
/* Problem: 钱币
Language: C++ Result: 正确 Time: 2026-07-09 09:41:46
User: admin Problem: 3700 contest_id: 1286*/
#include<iostream>
using namespace std;
int x,n,ans=0;
int main(){
while(cin>>x){
n++; //统计个数
ans+=x; //统计总价值
}
cout<<n<<endl<<ans;
return 0;
}
/* Problem: 钱币
Language: C++ Result: 正确 Time: 2026-07-09 09:32:53
User: admin Problem: 3700 contest_id: 0*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n,ans=0;
vector<string> v[20][40]; //v[i][j]表示i月j日过生日的名字列表
bool cmp(string s1,string s2){//按名字从短到长按序输出,长度相同的按字典序输出
if(s1.size()==s2.size()) return s1<s2;
return s1.size()<s2.size();
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
string s;int x,y;
cin>>s>>x>>y;
v[x][y].push_back(s); //将x月y日过生日的人存储起来
}
for(int i=1;i<=12;i++){ //月份
for(int j=1;j<=31;j++){ //日期
if(v[i][j].size()>1){ //至少两人生日相同
ans++; //有生日相同的输出
sort(v[i][j].begin(),v[i][j].end(),cmp);
cout<<i<<" "<<j<<" ";
for(int k=0;k<v[i][j].size();k++){
cout<<v[i][j][k]<<" ";
}
cout<<"\n";
}
}
}
if(ans==0) cout<<"None";
return 0;
}
/*
*/
/* Problem: 生日相同
Language: C++ Result: 正确 Time: 2026-07-08 17:50:26
User: admin Problem: 3872 contest_id: 0*/
#include<iostream>
#include<stack>
using namespace std;
int n,ans=0;
string s;
bool check(string s){
stack<char> st; //多组数据,注意栈的初始化
for(int i=0;i<s.size();i++){
if(s[i]=='<'){
st.push(s[i]);
}else if(s[i]=='('){//栈顶不能有( 更低的括号,如果有则非法,否则入栈。
if(st.size()&&st.top()=='<') return false;
else st.push(s[i]);
}else if(s[i]=='['){
if(st.size()&&(st.top()=='<' || st.top()=='(' )) return false;
else st.push(s[i]);
}else if(s[i]=='{'){
if(st.size()&&(st.top()=='<' || st.top()=='(' || st.top()=='[' )) return false;
else st.push(s[i]);
}else if(s[i]=='>'){
if(st.size()&&st.top()=='<') st.pop(); //匹配
else return false;
}else if(s[i]==')'){
if(st.size()&&st.top()=='(') st.pop(); //匹配
else return false;
}else if(s[i]==']'){
if(st.size()&&st.top()=='[') st.pop(); //匹配
else return false;
}else if(s[i]=='}'){
if(st.size()&&st.top()=='{') st.pop(); //匹配
else return false;
}
}
if(st.size()) return false;
else return true;
}
int main(){
cin>>n;
while(n--){
cin>>s;
if(check(s)) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
/*
左括号在入栈前需要检查:栈顶不能有比待入栈的优先级更低的括号,如果有则非法,否则入栈。
右括号检查栈顶是否匹配。
6
((
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
*/
/* Problem: 有优先级的括号匹配问题
Language: C++ Result: 正确 Time: 2026-07-08 17:02:25
User: admin Problem: 1333 contest_id: 0*/
#include<iostream>
using namespace std;
string a,b;
int ans=0; //答案是相同子串的长度最大值
int main(){
cin>>a>>b;
int lena=a.size(),lenb=b.size();
int len=min(lena,lenb);
for(int i=len;i>=1;i--){//长度从大到小枚举
string s1=a.substr(0,i),s2=b.substr(lenb-i,i);
if(s1==s2){
ans=i;
break;
}
}
for(int i=len;i>ans;i--){//长度从大到小枚举
string s1=b.substr(0,i),s2=a.substr(lena-i,i);
if(s1==s2){
ans=i;
break;
}
}
cout<<ans;
return 0;
}
/*
1 a取前缀,b取后缀,长度从大到小枚举,判断两个子串是否一样,一样则更新最大值,break;
1 b取前缀,a取后缀,长度从大到小枚举,判断两个子串是否一样,一样则更新最大值,break;
*/
/* Problem: 牛棚回声
Language: C++ Result: 正确 Time: 2026-07-08 16:32:33
User: admin Problem: 1138 contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
long long n,c,a[200010],ans=0;
int main(){
cin>>n>>c;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1,l=1,r=1;i<=n;i++){ //枚举被减数a[i]
while(a[l]<a[i]-c&&l<=n) l++; //减数的区间的左边界更新
while(a[r]<=a[i]-c&&r<=n) r++; //减数的区间的右边界更新
if(a[i]-a[l]==c) ans+=r-l; //符合条件的减数区间的左右边界之差
}
cout<<ans;
return 0;
}
/*
对于被减数a[i]而言,直接查找符合条件的减数区间的左右边界,可以得到数对的数量
l:表示减数区间的左边界
r:表示减数区间的右边界(开区间)
*/
/* Problem: A-B数对
Language: C++ Result: 正确 Time: 2026-07-08 16:17:23
User: admin Problem: 1692 contest_id: 0*/
#include<iostream>
using namespace std;
typedef long long ll; //别名
ll gcd(ll x,ll y){ //计算x和y的最大公约数
if(y==0) return x; //边界,即最大公约数
return gcd(y,x%y);
}
ll a,b;
int main(){
cin>>a>>b;
cout<<gcd(a,b);
return 0;
}
/* Problem: 辗转相除法求最大公约数
Language: C++ Result: 正确 Time: 2026-07-08 15:54:35
User: admin Problem: 1155 contest_id: 0*/
#include<iostream>
using namespace std;
long long n,a[1010]={0,1,2}; //a[i]表示第i项,带备忘录的递归
long long f(int x){ //计算数列的第x项
if(a[x]) return a[x];
if(x==1) return 0;
a[x]=f(x-1)+f(x-2); //没有计算的,计算出来存起来
return a[x];
}
int main(){
cin>>n;
cout<<f(n);
return 0;
}
/* Problem: 走楼梯
Language: C++ Result: 正确 Time: 2026-07-08 15:46:54
User: admin Problem: 1239 contest_id: 0*/
#include<iostream>
using namespace std;
long long n,a[1010]={0,0,1,1}; //a[i]表示第i项,带备忘录的递归
long long f(int x){ //计算数列的第x项
if(a[x]) return a[x];
if(x==1) return 0;
a[x]=f(x-1)+f(x-2); //没有计算的,计算出来存起来
return a[x];
}
int main(){
cin>>n;
cout<<f(n);
return 0;
}
/* Problem: 用递归实现斐波那契数列
Language: C++ Result: 正确 Time: 2026-07-08 15:43:53
User: admin Problem: 1178 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int f(int x){ //计算数列的第x项
if(x==1) return 0; //边界
if(x==2) return 1; //边界
return f(x-1)+f(x-2); //大问题分解为小问题
}
int main(){
cin>>n;
cout<<f(n);
return 0;
}
/* Problem: 用递归实现斐波那契数列
Language: C++ Result: 正确 Time: 2026-07-08 15:36:29
User: admin Problem: 1178 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int f(int x){ //计算1~x的和
if(x==1) return 1; //递归边界,返回答案
return x+f(x-1); //函数自己调用自己,规模变小了
}
int main(){
cin>>n;
cout<<f(n);
return 0;
}
/* Problem: 用递归实现累加
Language: C++ Result: 正确 Time: 2026-07-08 15:23:06
User: admin Problem: 1176 contest_id: 0*/
#include<iostream>
#include<stack>
using namespace std;
int n;
stack<int> st;
void turn(int x,int B){//将x转成B进制:短除法
if(x==0){ //特殊边界:0没有办法进入短除法的循环
printf("0(%d)\n",B); return;
}
if(x<0) printf("-"),x=-x; //负负得正
while(x){ //进入短除法
st.push(x%B); //保存余数
x/=B; //计算商
}
//输出余数
while(st.size()){ //栈不为空
if(st.top()<=9) printf("%d",st.top());
else printf("%c",char(st.top()-10+'A')); //输出A~F
st.pop(); //出栈
}
printf("(%d)\n",B);
}
int main(){
cin>>n;
turn(n,2);
turn(n,8);
turn(n,16);
return 0;
}
/* Problem: 进制转换
Language: C++ Result: 正确 Time: 2026-07-08 14:35:50
User: admin Problem: 1161 contest_id: 0*/
#include<iostream>
using namespace std;
long long q=1,ans=0;
string s;
int main(){
cin>>s;
for(int i=s.size()-1;i>=0;i--){//从后往前,进行数位分离
int x=s[i]-'0'; //0~9的字符转数字
if(s[i]>='A') x=s[i]-'A'+10; //A~F的字符转数字
ans+=x*q; //按位权展开,然后求和
q*=16; //下一轮的位权
}
cout<<ans;
return 0;
}
/* Problem: 十六进制转十进制
Language: C++ Result: 正确 Time: 2026-07-08 14:18:05
User: admin Problem: 1818 contest_id: 0*/
#include<iostream>
using namespace std;
double a,b,c;
int main(){
cin>>a>>b>>c;
double s=a+b+c;
if(s>=200){ //8折
printf("%.1lf",s*0.8);
}else{ //9折
printf("%.1lf",s*0.9);
}
return 0;
}
/*
90 100 10
80 15 5
选择简单的数据测试,测试结果一目了然
*/
/* Problem: 超市的折扣
Language: C++ Result: 正确 Time: 2026-07-07 20:23:31
User: admin Problem: 3479 contest_id: 0*/
#include<iostream>
using namespace std;
double a,b,c;
int main(){
cin>>a>>b>>c;
double s=a+b+c;
if(s>=200){ //8折
printf("%.1lf",s*0.8);
}else{ //9折
printf("%.1lf",s*0.9);
}
return 0;
}
/* Problem: 超市的折扣
Language: C++ Result: 正确 Time: 2026-07-07 20:22:33
User: admin Problem: 3479 contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+10;
long long n,k,a[N],ans=0;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1,j=n;i<j;){ //双指针
if(a[i]+a[j]==k){ //找到答案
cout<<"yes"<<endl;
cout<<a[i]<<" "<<a[j];
return 0;
}else if(a[i]+a[j]<k){ //和不够
i++;
}else{ //和大了
j--;
}
}
cout<<"no";
return 0;
}
/*
10 23
1 3 5 7 8 10 11 12 13 14
*/
/* Problem: 找和为k的两个元素
Language: C++ Result: 正确 Time: 2026-07-07 17:29:21
User: admin Problem: 2322 contest_id: 0*/
#include<iostream>
using namespace std;
typedef long long ll;
ll a,b,m,ans;
ll quickpow(ll a,ll b,ll m){
ll res=1; //初始值,因为要连乘,初始化为1
while(b){//直到b的二进制位取完,即b变成了0
if(b&1) res=res*a%m;
a=a*a%m; //倍增 a^1 a^2 a^4 a^8 a^16 a^32 ...
b>>=1; //抹掉最低位的1
}
return res;
}
int main(){
ll n,a,b,c,k;
cin>>n;
while(n--){
cin>>a>>b>>c>>k;
if(b-a==c-b){ //等差数列
ll gc=b-a; //公差
ans=(a+gc*(k-1))%200907;
}else{ //等比数列
ll gb=b/a; //公比
ans=(a*quickpow(gb,k-1,200907))%200907;
}
cout<<ans<<endl;
}
return 0;
}
/* Problem: 序列的第k个数
Language: C++ Result: 正确 Time: 2026-07-07 17:04:10
User: admin Problem: 1716 contest_id: 0*/
#include<iostream>
using namespace std;
typedef long long ll;
ll a,b,m,ans=0;
ll quickpow(ll a,ll b,ll m){
ll res=1; //初始值,因为要连乘,初始化为1
while(b){//直到b的二进制位取完,即b变成了0
if(b&1) res=res*a%m;
a=a*a%m; //倍增 a^1 a^2 a^4 a^8 a^16 a^32 ...
b>>=1; //抹掉最低位的1
}
return res;
}
int main(){
cin>>a>>b>>m;
cout<<quickpow(a,b,m);
return 0;
}
/*
计算a^b,
1 取b的二进制的最低位,抹掉最低位
如果最低位是1,需要连乘 a^1
如果最低位是0,过
2 取b的二进制的最低位,抹掉最低位
如果最低位是1,需要连乘 a^2
如果最低位是0,过
3 取b的二进制的最低位,抹掉最低位
如果最低位是1,需要连乘 a^4
如果最低位是0,过
4 取b的二进制的最低位,抹掉最低位
如果最低位是1,需要连乘 a^8
如果最低位是0,过
...
直到b的二进制位取完,即b变成了0
*/
/* Problem: A的B次方
Language: C++ Result: 正确 Time: 2026-07-07 16:38:07
User: admin Problem: 1715 contest_id: 0*/
#include<iostream>
using namespace std;
int n,a[100010],b[100010],mn=0;//mn表示1~i-1中前缀和的最小值
int ans=-2e9;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=b[i-1]+a[i];
ans=max(ans,b[i]-mn);
mn=min(mn,b[i]); //为下一轮准备
}
cout<<ans;
return 0;
}
/* Problem: 最大连续子段和
Language: C++ Result: 正确 Time: 2026-07-07 14:57:24
User: admin Problem: 2318 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,cnt=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){ //枚举1~n
cnt+=i; //累加
//cout<<cnt<<endl;
ans+=cnt; //每一轮将最新的cnt再次累加
}
cout<<ans;
return 0;
}
/*
第1轮中:ans+=1 (cnt=1)
第2轮中:ans+=1+2 (cnt=1+2)
第3轮中:ans+=1+2+3 (cnt=1+2+3)
...
第n轮中:ans+=1+2+3+...+n (cnt=1+2+3+...+n)
所以,我们可以用cnt变量在每一轮中表示上述式子中右侧的内容
*/
/* Problem: 累计相加.
Language: C++ Result: 正确 Time: 2026-07-06 18:54:39
User: admin Problem: 4040 contest_id: 0*/
#include<iostream>
using namespace std;
int a,b,c,d;
int main(){
cin>>a>>b>>c>>d;
cout<<c*60+d-a*60-b; //全部转换为分钟,再计算
return 0;
}
/* Problem: 时间规划.
Language: C++ Result: 正确 Time: 2026-07-06 18:45:27
User: admin Problem: 4013 contest_id: 0*/
#include<iostream>
using namespace std;
const int N=5e6+10;
long long ans=0,s,e,p[N],k=0;//乘积可能会爆掉,所以定义为long long
bool v[N]; //v[i]=1表示1是合数
int main(){
for(int i=2;i<=5000000;i++){ //欧拉筛,预处理质数
if(v[i]==0) p[++k]=i;
for(int j=1;i*p[j]<=5000000;j++){
v[i*p[j]]=1; //标记合数
if(i%p[j]==0) break; //i是p[j]的倍数
}
}
cin>>s>>e;
for(int i=1;i<=k;i++){ //暴力枚举所有的半质数,即两个质数的乘积
for(int j=i;j<=k;j++){ //注意:j不能从1开始,避免重复计算
if(p[i]*p[j]>e) break; //跳出内层循环
if(p[i]*p[j]>=s&&p[i]*p[j]<=e){
ans++;
}
}
}
cout<<ans;
return 0;
}
/* Problem: 半质数
Language: C++ Result: 正确 Time: 2026-07-06 17:53:15
User: admin Problem: 1616 contest_id: 0*/
#include<iostream>
using namespace std;
const int N=5e6+10;
long long ans=0,s,e,p[N],k=0;
bool v[N]; //v[i]=1表示1是合数
int main(){
for(int i=2;i<=5000000;i++){ //欧拉筛,预处理质数
if(v[i]==0) p[++k]=i;
for(int j=1;i*p[j]<=5000000;j++){
v[i*p[j]]=1; //标记合数
if(i%p[j]==0) break; //i是p[j]的倍数
}
}
cin>>s>>e;
for(int i=1;i<=k;i++){ //暴力枚举所有的半质数,即两个质数的乘积
for(int j=i;j<=k;j++){ //注意:j不能从1开始,避免重复计算
if(p[i]*p[j]>e) break; //跳出内层循环
if(p[i]*p[j]>=s&&p[i]*p[j]<=e){
ans++;
}
}
}
cout<<ans;
return 0;
}
/* Problem: 半质数
Language: C++ Result: 正确 Time: 2026-07-06 17:52:33
User: admin Problem: 1616 contest_id: 0*/
#include<iostream>
#include<map>
using namespace std;
const int M=1e9+7;
long long n,x,ans=1;
map<int,int> mp; //<质因数,出现次数>
void solve(long long x){ //将x分解质因数
for(int i=2;i*i<=x;i++){
while(x%i==0){
mp[i]++; //i的幂次+1
x/=i;
}
}
if(x>1) mp[x]++; //如果还剩下一个大于1的质因子
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
solve(x); //分解质因数
}
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){ //遍历map
//cout<<it->first<<" "<<it->second<<endl;
long long sum=1, x=it->first, y=it->second, ji=1;
for(int i=1;i<=y;i++){ //计算 x^0+x^1+...+x^y , sum表示 x^0+x^1+...+x^y
ji=ji*x%M; //ji依次表示x^1,x^2,...,x^y
sum=(sum+ji)%M;
}
ans=ans*sum%M; //计算 (x1^0+x1^1+...+x1^y2)*...*(xm^0+xm^1+...+xm^ym)
}
cout<<ans;
return 0;
}
/* Problem: 乘积的约数和
Language: C++ Result: 正确 Time: 2026-07-06 17:30:26
User: admin Problem: 2444 contest_id: 0*/
#include<iostream>
#include<map>
using namespace std;
int T,n,ans=0;
int main(){
scanf("%d",&T);
while(T--){ //多组数据
map<int,bool> mp;
cin>>n;
for(int i=1;i<=n;i++){
int x; scanf("%d",&x);
if(mp.count(x)==0){ //x是否已经在mp中标记
printf("%d ",x);
mp[x]=true; //标记,类似与数组下标标记
}
}
printf("\n");
}
return 0;
}
/* Problem: 不重复数字
Language: C++ Result: 正确 Time: 2026-07-06 16:51:11
User: admin Problem: 2704 contest_id: 0*/
#include<iostream>
#include<map>
using namespace std;
int n,a[100010],cnt=0;
map<int,int,greater<int> > mp; //默认根据关键字从大到小排序,先表示<分数,人数>,后更新为<分数,排名>
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
mp[a[i]]++; //用分数作为关键字,进行计数,类似于数组下标计数
}
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){
int x=it->second; // x=it->second; 等价于 x=(*it).second;
//cout<<(*it).first<<" "<<x<<" "<<endl;
(*it).second=cnt+1; //将人数 更新为 排名
cnt+=x; //下一个分数前面,有cnt个人
}
for(int i=1;i<=n;i++) printf("%d\n",mp[a[i]]); //输出每一个分数的排名
return 0;
}
/* Problem: 学校排名
Language: C++ Result: 正确 Time: 2026-07-06 16:33:51
User: admin Problem: 1868 contest_id: 0*/
#include<iostream>
#include<map>
using namespace std;
int n,a[100010],cnt=0;
map<int,int,greater<int> > mp; //默认根据关键字从大到小排序,先表示<分数,人数>,后更新为<分数,排名>
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
mp[a[i]]++; //用分数作为关键字,进行计数,类似于数组下标计数
}
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){
int x=(*it).second;
//cout<<(*it).first<<" "<<x<<" "<<endl;
(*it).second=cnt+1; //将人数 更新为 排名
cnt+=x; //下一个分数前面,有cnt个人
}
for(int i=1;i<=n;i++) printf("%d\n",mp[a[i]]); //输出每一个分数的排名
return 0;
}
/*
<关键字,值> 键值对
*/
/* Problem: 学校排名
Language: C++ Result: 正确 Time: 2026-07-06 16:29:01
User: admin Problem: 1868 contest_id: 0*/
#include<iostream>
#include<map>
using namespace std;
int n,a[100010],cnt=0;
map<int,int,greater<int> > mp; //默认根据关键字从大到小排序,先表示<分数,人数>,后更新为<分数,排名>
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
mp[a[i]]++; //用分数作为关键字,进行计数,类似于数组下标计数
}
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){
int x=(*it).second;
//cout<<(*it).first<<" "<<x<<" "<<endl;
(*it).second=cnt+1; //将人数 更新为 排名
cnt+=x; //下一个分数前面,有cnt个人
}
for(int i=1;i<=n;i++) cout<<mp[a[i]]<<endl; //输出每一个分数的排名
return 0;
}
/*
<关键字,值> 键值对
*/
/* Problem: 学校排名
Language: C++ Result: 正确 Time: 2026-07-06 16:27:50
User: admin Problem: 1868 contest_id: 0*/