#include<iostream>
using namespace std;
int T,n,k,a[1010],ans=0;
int main(){
cin>>T;
while(T--){//T组用例
ans=0; //多个用例,结果必须重新计数
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){//枚举从1号到n号同学
if(a[i]>a[k]) ans++;
}
cout<<ans<<endl;
}
return 0;
}
/*
如何知道有几个人分数比小明高?
1 小明是a[k]
2 枚举从1号到n号同学,比较每个同学的分数是否大于小明
如果a[i]>a[k] ans++
*/
/* Problem: 期末成绩
Language: C++ Result: 正确 Time: 2026-03-29 16:22:27
User: admin Problem: 1509 contest_id: 0*/
#include<iostream>
using namespace std;
int n,y,m,d,ans=0;
int p[]={0,31,59,90,120,151,181,212,243,273,304,334,365};
int r[]={0,31,60,91,121,152,182,213,244,274,305,335,366};
int main(){
cin>>n;
while(n--){
cin>>y>>m>>d;
if(y%400==0 || y%100!=0&&y%4==0) cout<<r[m-1]+d<<endl;
else cout<<p[m-1]+d<<endl;
}
return 0;
}
/*
1、打表法:用数组预存每个月的天数
2、输入年y月m日d,答案是:
闰年:r[m-1]+d
平年:p[m-1]+d
*/
/* Problem: 计算天数
Language: C++ Result: 正确 Time: 2026-03-29 15:55:35
User: admin Problem: 2001 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[110];
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n-1;i++){//注意点:不要比较数组外的内容
if(a[i]!=a[i+1]){//从前往后,比较每对相邻的珠子
ans++;
}
}
cout<<ans;
return 0;
}
/* Problem: 珠子计算
Language: C++ Result: 正确 Time: 2026-03-29 15:42:44
User: admin Problem: 1812 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[110];
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=n;i++){//注意点:不要比较数组外的内容
if(a[i]!=a[i-1]){//从前往后,比较每对相邻的珠子
ans++;
}
}
cout<<ans;
return 0;
}
/*
从前往后,比较每对相邻的珠子
如果 a[i]!=a[i-1] ,则ans++
*/
/* Problem: 珠子计算
Language: C++ Result: 正确 Time: 2026-03-29 15:40:59
User: admin Problem: 1812 contest_id: 0*/
#include<iostream>
using namespace std;
long long n,ans=0,cha;
int main(){
cin>>n;
cha=n;
for(long long i=1;i<=n*4;i*=2){//枚举2的幂:1 2 4 8 16 32...
if(abs(n-i)<cha){
cha=abs(n-i); //更新最小的差值
ans=i;
}
}
cout<<ans;
return 0;
}
/*
枚举2的幂
*/
/* Problem: 寻找2的幂.
Language: C++ Result: 正确 Time: 2026-03-29 15:25:15
User: admin Problem: 3023 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int m=i*i;
if(i==m%10 || i==m%100 || i==m%1000 || i==m%10000){
ans++;
}
}
cout<<ans;
return 0;
}
/*
难点:如何取到数字的后一位,后两位 ,后三位 ,后四位
m%10 m%100 m%1000 m%10000
*/
/* Problem: 同构数.
Language: C++ Result: 正确 Time: 2026-03-29 15:11:10
User: admin Problem: 3570 contest_id: 0*/
#include<iostream> //辗转相除法
using namespace std;
int a,b;
int main(){
cin>>a>>b;
int ans=a*b;
while(a%b){ //1 用辗转相除法计算最大公约数
int y=a%b;
a=b; //除数 变 被除数
b=y; //余数 变 除数
}
cout<<ans/b; //2 最小公倍数=a*b/最大公约数
return 0;
}
/*
1 用辗转相除法计算最大公约数
2 最小公倍数=a*b/最大公约数
*/
/* Problem: 两个自然数的最小公倍数
Language: C++ Result: 正确 Time: 2026-03-29 15:03:08
User: admin Problem: 3032 contest_id: 0*/
#include<iostream> //试除法
using namespace std;
int a,b;
int main(){
cin>>a>>b;
for(int i=a;;i++){
if(i%a==0&&i%b==0){//i是a的倍数,也是b的倍数
cout<<i;
return 0;
}
}
return 0;
}
/* Problem: 两个自然数的最小公倍数
Language: C++ Result: 正确 Time: 2026-03-29 14:54:27
User: admin Problem: 3032 contest_id: 0*/
#include<iostream>
#include<cmath>
using namespace std;
double n,a,b,c,d,e,f;
int ans=0;
int main(){
cin>>n>>a>>b>>c>>d>>e>>f;
ans=min(ceil(n/a)*b,min(ceil(n/c)*d,ceil(n/e)*f)); //注意,答案直接用double,可能显示为科学技术的结果
cout<<ans;
return 0;
}
/*
n=57
最优的做法应该是:每一种都尝试买够n只
1 ceil(n/a)*b
2 ceil(n/c)*d
3 ceil(n/e)*f
取最小值
*/
/* Problem: 买铅笔.
Language: C++ Result: 正确 Time: 2026-03-29 14:44:55
User: admin Problem: 1534 contest_id: 0*/
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int g=n%10;
int s=n/10%10;
int b=n/100%10;
int q=n/1000%10;
cout<<g+s+b+q;
return 0;
}
/*
输入 计算 输出 个位 十位 百位 千位
1234 1+2+3+4 10 1234%10 1234/10%10 1234/100%10 1234/1000%10
1200 1+2+0+0 3 1200%10 1200/10%10 1200/100%10 1200/1000%10
n 难点:如何计算n的个位、十位、百位、千位
个位:n%10
十位:n/10%10
百位:n/100%10
千位:n/1000%10
*/
/* Problem: 四位数的和
Language: C++ Result: 正确 Time: 2026-03-29 10:37:30
User: admin Problem: 3223 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
cout<<n%10+n/10;
return 0;
}
/*
输入 计算 输出
10 1+0 1
12 1+2 3
78 7+8 15
a a%10+a/10
*/
/* Problem: 求一个两位数的个位和十位的和
Language: C++ Result: 正确 Time: 2026-03-29 10:26:19
User: admin Problem: 3427 contest_id: 0*/
#include<iostream>
using namespace std;
long long T,n,a[100010],ans=0;
long long f(){
ans=0;//结果初始化
for(int i=2;i<=n;i++){
if(a[i]==a[i-1]) continue;
if(a[i]<a[i-1]){
if(i%2==0) return -1;//前面是奇数,无解
long long x=(a[i-1]-a[i]);
ans+=(i-1)*x; //注意:int的计算结果如果超过范围,不会自动变成long long,定义变量时要注意数据类型
a[i-1]-=x;
}
if(a[i]>a[i-1]){
if(i==n) return -1;
long long x=a[i]-a[i-1];
if(a[i+1]<x) return -1;
ans+=2*x;
a[i]-=x;a[i+1]-=x;
}
//cout<<i<<" "<<ans<<endl;
}
return ans;
}
int main(){
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cout<<f()<<endl;
}
return 0;
}
/*
4 6 4 4 6 4
4 4 6 6
6 6 4 4
8 10 5
0 1 0
10 9 9
从前往后砍树
1、如果a[i]==a[i-1] 先不砍树
2、a[i]<a[i-1]
如果i%2==0,前面是奇数,无解
否则:前面全部改成a[i]一样高,ans+=(i-1)*(a[i-1]-a[i]) ,更新 a[i-1]-=a[i-1]-a[i]
3、a[i]>a[i-1],a[i]只能和a[i+1]一起砍,砍掉 a[i]-a[i-1]
if(i==n) 无解
如果a[i+1]<a[i]-a[i-1],无解
否则:ans+=2*(a[i]-a[i-1]),更新 a[i]-=a[i]-a[i-1];a[i+1]-=a[i]-a[i-1]
*/
/* Problem: 杉树修剪
Language: C++ Result: 正确 Time: 2026-03-28 20:55:13
User: admin Problem: 2521 contest_id: 0*/
#include<iostream>
using namespace std;
long long T,n,a[100010],ans=0;
long long f(){
ans=0;//结果初始化
for(int i=2;i<=n;i++){
if(a[i]==a[i-1]) continue;
if(a[i]<a[i-1]){
if(i%2==0) return -1;//前面是奇数,无解
long long x=(a[i-1]-a[i]);
ans+=(i-1)*x;
a[i-1]-=x;
}
if(a[i]>a[i-1]){
if(i==n) return -1;
long long x=a[i]-a[i-1];
if(a[i+1]<x) return -1;
ans+=2*x;
a[i]-=x;a[i+1]-=x;
}
//cout<<i<<" "<<ans<<endl;
}
return ans;
}
int main(){
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cout<<f()<<endl;
}
return 0;
}
/*
4 6 4 4 6 4
4 4 6 6
6 6 4 4
8 10 5
0 1 0
10 9 9
从前往后砍树
1、如果a[i]==a[i-1] 先不砍树
2、a[i]<a[i-1]
如果i%2==0,前面是奇数,无解
否则:前面全部改成a[i]一样高,ans+=(i-1)*(a[i-1]-a[i]) ,更新 a[i-1]-=a[i-1]-a[i]
3、a[i]>a[i-1],a[i]只能和a[i+1]一起砍,砍掉 a[i]-a[i-1]
if(i==n) 无解
如果a[i+1]<a[i]-a[i-1],无解
否则:ans+=2*(a[i]-a[i-1]),更新 a[i]-=a[i]-a[i-1];a[i+1]-=a[i]-a[i-1]
4、
*/
/* Problem: 杉树修剪
Language: C++ Result: 正确 Time: 2026-03-28 20:53:08
User: admin Problem: 2521 contest_id: 0*/
#include<iostream>
#include<cmath>
using namespace std;
int n,a,b,w[500010],ans=0;
bool check(int x){//检查x秒是否足够
int t=0; //t表示那些没有晒干的进入烘干机的时间
for(int i=1;i<=n;i++){
int s=w[i]-a*x;//大家一起晒
if(s<=0) continue; //不需要烘干
t+=ceil(s*1.0/b); //第i件衣服需要的烘干时间
if(t>x) return false;//时间不够
}
return true;
}
int main(){
cin>>n>>a>>b;
for(int i=1;i<=n;i++) cin>>w[i];
int l=0,r=500010;
while(l<=r){
int mid=(l+r)/2; //假设mid秒
if(check(mid)){
ans=mid;
r=mid-1;
}else l=mid+1;
}
cout<<ans;
return 0;
}
/*
一、暴力思路:
1、湿度从大到小排序
2、每一秒拿湿度最大的取烘干,剩下的全部晒,然后重新排序(此处应可以优化为插入排序)
3、继续第2步,直到全湿度为<=0
二、答案具备单调性:二分答案
*/
/* Problem: 晒衣服.
Language: C++ Result: 正确 Time: 2026-03-28 19:49:52
User: admin Problem: 1867 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[1010],f[1010];
//f[i]表示从1~i中取数的最大值
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
f[1]=a[1];
for(int i=2;i<=n;i++){
f[i]=max(f[i-1],f[i-2]+a[i]); //不取自己 或 取自己 的两种情况中的最大值
}
cout<<f[n];
return 0;
}
/* Problem: 取数.
Language: C++ Result: 正确 Time: 2026-03-28 19:19:13
User: admin Problem: 2685 contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k,sum=0,b[100010],c[100010],mx=0,t=0;
//b[i]表示知识点i的已经取得的经验值之和
//c[i]表示知识点i的做题量
pair<int,int> a[100010];
int main(){
cin>>m>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i].second;
for(int i=1;i<=n;i++) cin>>a[i].first;
sort(a+1,a+n+1);//经验值从小到大排序
for(int i=n;i>=1;i--){//倒着来,经验值从大往小取题目
if(b[a[i].second]<k){//知识点a[i].second]需要继续做题
b[a[i].second]+=a[i].first; //更新经验值
if(b[a[i].second]>=k) t++;//满足要求的知识点+1
c[a[i].second]++; //更新做题量
sum++; //总做题量
mx=max(mx,c[a[i].second]);
}
}
if(t<m || mx>(n+1)/2) cout<<-1;
else cout<<max(sum,mx+mx-1);
return 0;
}
/*
1 做题数量最多的知识点的题量 mx
2 每个知识点都达到>=k的情况下的题量 sum
3 可以达到经验值>=k的知识点的数量 t (t<m,那么无解)
4 mx>(n+1)/2 (无解)
5 有解的答案: max(sum,mx+mx-1)
如何统计mx,sum
1、按照经验值从大到小排序
2、贪心:从前往后取题目,
如果某个知识点的经验值<k,则继续取;
如果该知识点经验值>=k,那么跳过这个题目
*/
/* Problem: 算法学习
Language: C++ Result: 正确 Time: 2026-03-28 19:07:42
User: admin Problem: 4272 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,f[100010];
//f[i]表示把i拆成完全平方数之和的数字个数最小的值
int main(){
cin>>n;
for(int i=1;i<=n;i++){
f[i]=i; //状态初始值
for(int j=1;j*j<=i;j++){ //表示可以从 i-j*j 转移到 i
f[i]=min(f[i],f[i-j*j]+1);
}
}
cout<<f[n];
return 0;
}
/* Problem: 小杨和整数拆分
Language: C++ Result: 正确 Time: 2026-03-28 18:25:47
User: admin Problem: 4271 contest_id: 0*/
#include<iostream>
using namespace std;
int n,a[100010],ans=0;
int b[100010],c[100010];
int main(){
cin>>n;
b[0]=1; c[n+1]=1; //初始值,为连乘准备
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=b[i-1]*a[i]%10000; //前缀积
}
for(int i=n;i>=1;i--){
c[i]=c[i+1]*a[i]%10000; //后缀积
}
for(int i=1;i<=n;i++){
printf("%d\n",b[i-1]*c[i+1]%10000);
}
return 0;
}
/*
A1:a2*a3*a4*a5
A2: a1*a3*a4*a5
A3: a1*a2*a4*a5
...
*/
/* Problem: 连乘问题
Language: C++ Result: 正确 Time: 2026-03-28 17:19:47
User: admin Problem: 1966 contest_id: 0*/
#include<iostream>
using namespace std;
int n,m,ans=0;
char a[1010][1010];
int lf[1010][1010],rg[1010][1010],up[1010][1010],dn[1010][1010];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) cin>>a[i][j];
//从上往下,从左往右
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='.'){
up[i][j]=up[i-1][j]+1; //从上往下计算
lf[i][j]=lf[i][j-1]+1; //从左往右计算
}
}
}
for(int i=n;i>=1;i--){
for(int j=m;j>=1;j--){
if(a[i][j]=='.'){
dn[i][j]=dn[i+1][j]+1; //从下往上计算
rg[i][j]=rg[i][j+1]+1; //从右往左计算
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='.'){//枚举每一个可以放炸弹的位置
ans=max(ans,up[i][j]+dn[i][j]+lf[i][j]+rg[i][j]-3); //取最大值
}
}
}
cout<<ans;
return 0;
}
/*
使用一维前缀和思想:左、右、上、下四个方向各做一次前缀和的预处理
*/
/* Problem: 消消乐
Language: C++ Result: 正确 Time: 2026-03-28 17:14:30
User: admin Problem: 1948 contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
string s[]={"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
"eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty",
"a", "both", "another", "first", "second", "third"};
int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,1,2,1,1,2,3};
int n,ans=0,b[10],k=0;
string t;
int main(){
for(int i=1;i<=6;i++){ //1 找到数字,打表匹配数字,把数字存入数组
cin>>t;
for(int j=0;j<26;j++){//字符串数组中有下标0~25,一共26个数字
if(a[j]*a[j]%100==0) continue;
if(t==s[j]){//匹配字符串
k++;
b[k]=a[j]*a[j]%100; //打表,找到第j个数字,并计算再存入数组,数组有k个数字
}
}
}
sort(b+1,b+k+1);
cout<<b[1];
for(int i=2;i<=k;i++){
if(b[i]<10) cout<<0; //输出的时候注意个位数补0(第一个数字除外)
cout<<b[i];
}
return 0;
}
/*
1 找到数字,打表匹配数字,把数字存入数组
2 把数组从小到大排序,输出,输出的时候注意个位数补0(第一个数字除外)
设计用例,如
four five six one two three .
ten ten ten ten ten one .
*/
/* Problem: 斯诺登事件
Language: C++ Result: 正确 Time: 2026-03-28 15:48:37
User: admin Problem: 2376 contest_id: 0*/
#include<iostream>
#include<string>
using namespace std;
int n,r;
string s; //把这个栈,改成string
int main(){
cin>>n>>r;
while(n){//短除法
int x=n%r;
if(x<10) s+=char(x+'0'); //数字转字符,并拼接
else s+=char('A'+x-10);
n/=r;
}
for(int i=s.size()-1;i>=0;i--){ //逆序输出
cout<<s[i];
}
return 0;
}
/*
短除法:取余数,然后倒着输出
*/
/* Problem: 进制转换
Language: C++ Result: 正确 Time: 2026-03-28 15:22:19
User: admin Problem: 4119 contest_id: 0*/
#include<iostream>
#include<stack>
using namespace std;
int n,r;
stack<int> st;
int main(){
cin>>n>>r;
while(n){//短除法
st.push(n%r); //余数入栈
n/=r;
}
while(st.size()){//栈非空,就输出数据
int x=st.top(); //取出栈顶的数字,并输出
if(x<10) cout<<x;
else cout<<char('A'+x-10);
st.pop();//出栈
}
return 0;
}
/*
短除法:取余数,然后倒着输出
*/
/* Problem: 进制转换
Language: C++ Result: 正确 Time: 2026-03-28 15:13:49
User: admin Problem: 4119 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=10;i<=n;i++){//枚举范围内的每个数字
int g=i%10;
int s=i/10%10;
int b=i/100%10;
if(i%(g+s+b)==0){//i 能够整除 i的各位之和 ,即自整除数
cout<<i<<endl;
}
}
return 0;
}
/* Problem: 自整除数.
Language: C++ Result: 正确 Time: 2026-03-28 11:15:52
User: admin Problem: 1820 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
cin>>n;
while(n%2==0){ //能够整除2
ans++; //计数次数+1
n/=2; //更新n
}
cout<<ans;
return 0;
}
/* Problem: 能够整除几次2.
Language: C++ Result: 正确 Time: 2026-03-28 11:08:58
User: admin Problem: 3759 contest_id: 0*/
#include<iostream>
using namespace std;
int k,l,r,ans=0;
int main(){
cin>>k>>l>>r;
for(int i=l;i<=r;i++){//枚举需要计算的范围[l,r]
if(i%10==k || i%k==0){//判断是幸运数
ans+=i;
}
}
cout<<ans;
return 0;
}
/* Problem: 小明的幸运数.
Language: C++ Result: 正确 Time: 2026-03-28 10:52:24
User: admin Problem: 4043 contest_id: 0*/
#include<iostream>
using namespace std;
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
if(i%m==0) continue; //跳过m的倍数
cout<<i<<endl;
}
return 0;
}
/* Problem: ⼩杨报数.
Language: C++ Result: 正确 Time: 2026-03-28 10:22:01
User: admin Problem: 4049 contest_id: 0*/
#include<iostream>
using namespace std;
int x,n,ans=0;
int main(){
cin>>x>>n;
ans=(x+n)%7;
if(ans) cout<<ans; //余数不为0
else cout<<7; //余数为0,则是星期天
return 0;
}
/*
今天是星期x 过了n天 是星期几
1 6 7
1 7 1
3 6 2
3 7 3
3 15 4
(x+n)%7 注意:余数为0,则是星期天
*/
/* Problem: ⼩杨的考试.
Language: C++ Result: 正确 Time: 2026-03-28 10:19:10
User: admin Problem: 4048 contest_id: 0*/
#include<iostream>
using namespace std;
int n,x,y,ans=0;
int main(){
cin>>n>>x>>y;
if(y%x==0){//能整除,正好吃掉y/x个
ans=n-y/x;
}else{//不能整除,则多吃坏一个
ans=n-y/x-1;
}
if(ans<0) ans=0; //剩下的数量不能小于0
cout<<ans;
return 0;
}
/*
n个苹果 x小时吃完一个 经过y小时 剩下几个完整的苹果
10 4 9 7
10 4 12 7
10 4 13 6
10 4 40 0
10 4 100 0
如果y%x==0 那么,剩下n-y/x
否则 那么,剩下n-y/x-1
但是,剩下的数量不能小于0
*/
/* Problem: 苹果和虫子
Language: C++ Result: 正确 Time: 2026-03-27 20:36:14
User: admin Problem: 1051 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=8;//n表示重量 ,ans表示费用(初始8元,只要寄东西,就收钱)
char c; //c表示是否加急
int main(){
cin>>n>>c;
if(c=='y') ans+=5; //加急 +5元 ,这个和重量没有关系
if(n>1000){
n-=1000; //先计算超重重量
if(n%500==0){
ans+=n/500*4; //超重的费用
}else{
ans+=n/500*4+4; //超重的费用
}
}
cout<<ans;
return 0;
}
/*
重量 n 加急 c 费用
800 n 8
1000 n 8
1001 n 8+4=12
1002 y 12+5=17
3000 y 8+2000/500*4+5=29
3002 y 8+2002/500*4+4+5=33
加急 +5元 ,这个和重量没有关系
如果重量 n<=1000,基本费用8元
否则 先计算超重重量: n-=1000;
如果 n%500==0 那么增加费用:n/500*4
否则 那么增加费用: n/500*4 + 4
*/
/* Problem: 计算邮资
Language: C++ Result: 正确 Time: 2026-03-27 20:20:22
User: admin Problem: 1622 contest_id: 0*/
#include<iostream>
using namespace std;
int a,b,c,d;
int main(){
cin>>a>>b>>c>>d;
if(d<b){//先判断分钟是否需要借位
c--; //小时借出1
d+=60;
}
cout<<c-a<<" "<<d-b;
return 0;
}
/*
注意:凡是多位数减法运算,先算低位,再算高位
如果d<b,那么d需要借位,c--,d+=60;
*/
/* Problem: 游泳时间
Language: C++ Result: 正确 Time: 2026-03-27 19:51:16
User: admin Problem: 2349 contest_id: 0*/
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long int ll;
using pll = pair<ll, ll>;
const int maxn = 2e5 + 10;
const ll mod = 998244353LL;
const ll inf = 1145141919810LL;
bitset<maxn>b1, b2, b3, b2y2, b2y1, b2z1, b2z2;
int t, c; int a[maxn], b[maxn], d[maxn]; char s[maxn];
int main() {
ll y1 = 0, y2 = 0, z1 = 0, z2 = 0;
scanf("%d%d", &t, &c); int now = 100002, tot = 0, mx = 0;
for (int i = 1; i <= t; i++) scanf("%d", &a[i]);
scanf("%s", s + 1);
for (int i = 1; i <= c; i++) {
b[i] = now;
if (s[i] == 'L') --now;
if (s[i] == 'R') ++now;
if (s[i] == 'F') ++d[now], b1[now] = 1;
//d[k] 1..i 位置 k 被标记了几次
}
for (int i = 1; i <= t; i++) a[i] += 100002, b3[a[i]] = 1; // b3 目标
ll ans = y1 = y2 = z1 = z2 = (b1 & b3).count();
for (int i = c; i >= 1; i--) {
//cout << y1 << " " << y2 << " " << z1 << " " << z2 << "\n";
now = b[i];
if (s[i] == 'L') {
//now 不变,整个区间向右移
ans = max(ans, y2); ll kal = 0;
if (!d[now] && !b2y1[now] && b3[now]) ++y1, kal = 1;
ans = max(ans, y1);
y1 -= kal;
}
else if (s[i] == 'R') {
ans = max(ans, z2); ll kal = 0;
if (!d[now] && !b2z1[now] && b3[now]) ++z1, kal = 1;
//ans = max(ans, (ll)((b1 | (b2z1)) & b3).count());
ans = max(ans, z1);
z1 -= kal;
}
else {
int u = b1[now]; ll kal = 0;
if (d[now] == 1 && !b2y1[now] && b3[now]) kal = 1, --y1;
ans = max(ans, y1); y1 += kal; kal = 0;
if (d[now] == 1 && !b2z1[now] && b3[now]) kal = 1, --z1;
ans = max(ans, z1); z1 += kal; kal = 0;
}
if (s[i] == 'F') {
int u = d[now]; --d[now];
if (now + 2 < maxn) {
int v = b2y2[now + 2];
b2y2[now + 2] = 1;
if (!b2y2[now] && b3[now] && u == 1) --y2;
if (!d[now + 2] && b3[now + 2] && !v) ++y2;
}
if (now + 1 < maxn) {
int v = b2y1[now + 1];
b2y1[now + 1] = 1;
if (!b2y1[now] && b3[now] && u == 1) --y1;
if (!d[now + 1] && b3[now + 1] && !v) ++y1;
}
if (now - 1 >= 0) {
int v = b2z1[now - 1];
b2z1[now - 1] = 1;
if (!b2z1[now] && b3[now] && u == 1) --z1;
if (!d[now - 1] && b3[now - 1] && !v) ++z1;
}
if (now - 2 >= 0) {
int v = b2z2[now - 2];
b2z2[now - 2] = 1;
if (!b2z2[now] && b3[now] && u == 1) --z2;
if (!d[now - 2] && b3[now - 2] && !v) ++z2;
}
}
}
printf("%lld\n", ans);
return 0;
}
/* Problem: 命中
Language: C++ Result: 正确 Time: 2026-03-26 08:10:24
User: admin Problem: 4239 contest_id: 0*/
#include<iostream> //解法2
using namespace std;
int n,ans=0;
int main(){
cin>>n;
int mid=n/2+1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){//规律:行号和列号到mid的距离之和正好是mid-1,则输出#
if(abs(i-mid)+abs(j-mid)==mid-1){
cout<<"#";
}else{
cout<<".";
}
}
cout<<endl;
}
return 0;
}
/* Problem: 菱形
Language: C++ Result: 正确 Time: 2026-03-22 16:25:58
User: admin Problem: 4498 contest_id: 0*/
#include<iostream> //解法1
using namespace std;
int n,ans=0;
int main(){
cin>>n;
int m=n/2+1;
for(int i=m;i>=1;i--){
for(int j=1;j<=n;j++){//1~n列
if(i==j || i+j==n+1){
cout<<"#";
}else{
cout<<".";
}
}
cout<<endl;//每行结束,要换行
}
for(int i=2;i<=m;i++){
for(int j=1;j<=n;j++){//1~n列
if(i==j || i+j==n+1){
cout<<"#";
}else{
cout<<".";
}
}
cout<<endl;//每行结束,要换行
}
return 0;
}
/* Problem: 菱形
Language: C++ Result: 正确 Time: 2026-03-22 16:09:25
User: admin Problem: 4498 contest_id: 0*/
#include<iostream> //解法2
using namespace std;
bool check(int m){//功能是检查x是否优美,优美返回true, 不美返回false
int g=m%10;//个位
while(m>0){//当m不为0时候,则拆数,拆出i的每一位和个位比较
if(m%10!=g){
return false;//优美
}
m/=10; //抹掉个位
}
return true;//循环结束,都没有发现不优美,那么就是优美的
}
int n,ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){//枚举1~n的每个数字,判断i是否优美
if(check(i)) ans++; //对答案贡献1个数字
}
cout<<ans;
return 0;
}
/* Problem: 优美的数字
Language: C++ Result: 正确 Time: 2026-03-22 16:00:39
User: admin Problem: 4497 contest_id: 0*/
#include<iostream> //解法1
using namespace std;
int n,ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){//枚举1~n的每个数字,判断i是否优美
int g=i%10;
int m=i,flag=1; //flag=1表示优美
while(m>0){//当m不为0时候,则拆数,拆出i的每一位和个位比较
if(m%10!=g){
flag=0;//证明i是不优美的
break;
}
m/=10; //抹掉个位
}
if(flag) ans++; //对答案贡献1个数字
}
cout<<ans;
return 0;
}
/* Problem: 优美的数字
Language: C++ Result: 正确 Time: 2026-03-22 15:55:04
User: admin Problem: 4497 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[1010],f[1010];
//f[i]表示以i结尾的最大上升子序列和
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
f[i]=a[i];//初始状态
for(int j=1;j<i;j++){//i尝试续在j的后面
if(a[i]>a[j]){
f[i]=max(f[i],f[j]+a[i]);
}
}
ans=max(ans,f[i]);
}
cout<<ans;
return 0;
}
/* Problem: 最大上升子序列和
Language: C++ Result: 正确 Time: 2026-03-21 20:28:49
User: admin Problem: 1729 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[1010],f[1010],g[1010];
//f[i]表示从前往后,以i为终点的最长上升子序列的长度
//g[i]表示从后往前,以i为中的的最长上升子序列的长度
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
f[i]=1;
for(int j=1;j<i;j++){//i是否可以续在j的后面
if(a[i]>a[j]) f[i]=max(f[i],f[j]+1);
}
}
for(int i=n;i>=1;i--){
g[i]=1;
for(int j=n;j>i;j--){//i是否可以续在j的前面
if(a[i]>a[j]) g[i]=max(g[i],g[j]+1);
}
ans=max(ans,f[i]+g[i]-1);
}
cout<<ans;
return 0;
}
/* Problem: 登山
Language: C++ Result: 正确 Time: 2026-03-21 20:14:57
User: admin Problem: 1728 contest_id: 0*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,m;
vector<int> vc[1010];//v[i]存储第i种武器的所有强化材料的花费
ll ans=1e18;
ll check(int x){//其他的武器强化材料只能最多是x-1种
int cnt=vc[1].size(); //小杨本来就有的
ll cost=0;
vector<int> tmp; //把没买的都存入tmp数组
for(int i=2;i<=n;i++){ //收刮第i种武器的强化材料,使得其最多是x-1种
int buy=max((int)vc[i].size()-(x-1),0);
for(int j=0;j<buy;j++){//买的,增加花费
cost+=vc[i][j];
}
for(int j=buy;j<vc[i].size();j++){//暂时不用买的,凑在一起
tmp.push_back(vc[i][j]);
}
cnt+=buy;//第1种武器的强化材料数量更新
}
sort(tmp.begin(),tmp.end()); //剩余的全部强化材料继续按照 花费从小到大排序
for(int i=0;i<x-cnt;i++) cost+=tmp[i];
return cost;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int pi,ci;
cin>>pi>>ci;
vc[pi].push_back(ci);
}
for(int i=1;i<=n;i++) sort(vc[i].begin(),vc[i].end());//给第i种武器的强化材料花费从小到大排序
for(int i=1;i<=m;i++){
ans=min(ans,check(i));//需要的材料数量i的花费,所有情况取最小值
}
cout<<ans;
return 0;
}
/*
1、枚举第1种武器需要的材料数量i,那么其他的武器的强化材料最多是i-1种。对于超过i-1的,都要卖给小杨,肯定选便宜的买。
2、小杨买完第一批后,发现自己还不够i种:那么剩下的其他材料从小到大排序,让小杨凑足正好i种
*/
/* Problem: 武器强化.
Language: C++ Result: 正确 Time: 2026-03-21 19:53:12
User: admin Problem: 4268 contest_id: 0*/
#include<iostream>
using namespace std;
typedef long long ll;
ll n,ans=0;
int solve(int x){//分解x:1+2+3+....<=x,这样的连续数字个数是多少,则可以贡献多少个奇妙数字
int ret=0,i=1;
while(x>=i){
ret++;
x-=i;
i++;
}
return ret;
}
int main(){
cin>>n;
for(ll i=2;i*i<=n;i++){//枚举可能的质因子
if(n%i==0){
int x=0;//幂次
while(n%i==0){
x++;//幂次+1
n/=i;
}
ans+=solve(x);// 计算x贡献多少个奇妙数字
}
}
if(n>1) ans++;//最后有一个较大的质因子,那么该质因子贡献1
cout<<ans;
return 0;
}
/*
1 分解质因数,找到每个质因子的幂次,假设幂次是x
2 分解x:1+2+3+....<=x,这样的连续数字个数是多少,则可以贡献多少个奇妙数字
*/
/* Problem: 奇妙数字.
Language: C++ Result: 正确 Time: 2026-03-21 19:12:48
User: admin Problem: 4269 contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,ans=0;
struct bus{
int start,size;//size容量
}b[1010];
bool cmp1(bus b1,bus b2){
return b1.start<b2.start;
}
struct people{
int start,end,id,wait;//wait表示坐车的等待时间
}p[10010];
int sti(string s){//功能:把字符串s转换为整数分钟
return (s[0]-'0')*10*60 + (s[1]-'0')*60 + (s[3]-'0')*10 + (s[4]-'0');
}
bool cmp2(people p1,people p2){
if(p1.start==p2.start) return p1.id<p2.id;
return p1.start<p2.start;
}
bool cmp3(people p1,people p2){
return p1.id<p2.id;//方便输出
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
string s;
cin>>s>>b[i].size;
b[i].start=sti(s);
}
for(int i=1;i<=m;i++){
string s,e;
cin>>s>>e;
p[i].start=sti(s); p[i].end=sti(e); p[i].id=i; p[i].wait=-1;//如果最后处理完了,仍然为-1,说明此人没有坐上车
}
sort(b+1,b+1+n,cmp1); //汽车排序
sort(p+1,p+1+m,cmp2); //乘客排序
for(int i=1;i<=n;i++){//汽车依次进站
int cnt=b[i].size;//汽车的容量
for(int j=1;j<=m;j++){//挨个排队,准备上车
if(p[j].wait==-1 && p[j].start<=b[i].start && p[j].end>=b[i].start && cnt>0){
p[j].wait=b[i].start-p[j].start;//抱怨等待时间
cnt--; //汽车容量-1
if(cnt==0) break;//满了,就发车
}else if(p[j].start>b[i].start) break;//后面的人也没有必要试了
}
}
sort(p+1,p+1+m,cmp3); //乘客排序
for(int i=1;i<=m;i++){
if(p[i].wait==-1) printf("Leave\n");
else printf("%d\n",p[i].wait);
}
return 0;
}
/* Problem: 公交车站
Language: C++ Result: 正确 Time: 2026-03-21 18:38:55
User: admin Problem: 1952 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,c[5000010];//c[i]表示1到i的和
int main(){
cin>>n;
for(int i=1;i<=n/2+1;i++) c[i]=c[i-1]+i;//连续数字前缀和
for(int i=1;i<=n/2+1;i++){//1 从前往后枚举终点
for(int j=i-1;j>=1;j--){//2 区间的起点,计算区间[j,i]的和是否正好是n
if(c[i]-c[j-1]==n){//b.区间和正好是n,找到方案,输出,break
ans++; //方案+1
for(int k=j;k<=i;k++) cout<<k<<" ";
cout<<endl;
break;
}else if(c[i]-c[j-1]>n){//c.区间和超过n,不需要继续往前,break
break;
}
}
}
if(ans==0) cout<<"None";
return 0;
}
/*
对于n:
1 从前往后枚举终点:n/2+1
2 从终点往前枚举,寻找连续区间和正好是n的:
a.区间和不够n,继续往前
b.区间和正好是n,找到方案,输出,break
c.区间和超过n,不需要继续往前,break
*/
/* Problem: 连续数字和
Language: C++ Result: 正确 Time: 2026-03-21 17:25:26
User: admin Problem: 2026 contest_id: 0*/
#include<iostream>
using namespace std;
const int N=5e5+10;
int n,a[N],b[N],ans=0,c[N];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
c[i]=c[i-1]+b[i];//预处理b[i]的前缀和
}
for(int i=0;i<=n;i++){//小明参加第i场
ans=max(ans,a[i] + c[n] - b[i]); //不用区间和,直接计算
}
cout<<ans;
return 0;
}
/*
1 预处理b[i]的前缀和 c[i]=c[i-1]+b[i]
2 在O(1)的时间内计算数组b区间和[l,r]:c[r]-c[l-1]
*/
/* Problem: 最大得分
Language: C++ Result: 正确 Time: 2026-03-21 16:57:50
User: admin Problem: 2485 contest_id: 0*/
#include<iostream>
using namespace std;
const int N=5e5+10;
int n,a[N],b[N],ans=0,c[N];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
c[i]=c[i-1]+b[i];//预处理b[i]的前缀和
}
for(int i=0;i<=n;i++){//小明参加第i场
ans=max(ans,a[i] + c[i-1]-c[0] + c[n]-c[i]); //小x参加 1~i-1 i+1~n
}
cout<<ans;
return 0;
}
/*
1 预处理b[i]的前缀和 c[i]=c[i-1]+b[i]
2 在O(1)的时间内计算数组b区间和[l,r]:c[r]-c[l-1]
*/
/* Problem: 最大得分
Language: C++ Result: 正确 Time: 2026-03-21 16:57:33
User: admin Problem: 2485 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[1010],s,e;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
s=a[1];
for(int i=2;i<=n;i++){
if(a[i]<=a[i-1]){//意味着一段上坡结束了
e=a[i-1];//这是上一个上坡的最高点
ans=max(ans,e-s);
s=a[i];//新的一个上坡就开始了
}
}
ans=max(ans,a[n]-s);
cout<<ans;
return 0;
}
/* Problem: 体育锻炼计划
Language: C++ Result: 正确 Time: 2026-03-21 16:21:43
User: admin Problem: 2430 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[35]={1,2};
int main(){
for(int i=2;i<=30;i++) a[i]=2*a[i-1];//预处理,递推出 2的正整数次幂
cin>>n;
while(n--){
int x;
cin>>x;
for(int i=1;i<=30;i++){
if(x==a[i]){
ans++;
break;
}
}
}
cout<<ans;
return 0;
}
/*
1 预处理:2的正整数次幂存起来
2 每次输入一个x,比较这个预存的数字(最多30个数)
*/
/* Problem: 次方和
Language: C++ Result: 正确 Time: 2026-03-21 16:05:08
User: admin Problem: 2473 contest_id: 0*/
#include<iostream>//解法3:O(1)的时间复杂度
using namespace std;
int t,n,ans=0;
int main(){
cin>>t;
while(t--){
cin>>n;
if(n<150) cout<<n<<endl;
else if(n<=200 || n>=300) cout<<n%50<<endl;
else cout<<n%200<<endl;
}
return 0;
}
/* Problem: 坑爹的黑店
Language: C++ Result: 正确 Time: 2026-03-21 15:54:33
User: admin Problem: 1207 contest_id: 0*/
#include<iostream>//解法2:去掉最后一层循环
using namespace std;
int t,n,ans=0;
int main(){
cin>>t;
while(t--){
cin>>n;
ans=n;//剩下的钱,初始值尽可能大
for(int i=0;i<=n/150;i++){
for(int j=0;j<=n/200;j++){
int x=n-i*150-j*200;//剩下的可以买橙汁的钱
if(x>=0){
ans=min(ans,x%350);
}
}
}
cout<<ans<<endl;
}
return 0;
}
/* Problem: 坑爹的黑店
Language: C++ Result: 正确 Time: 2026-03-21 15:43:30
User: admin Problem: 1207 contest_id: 0*/
#include<iostream>//最暴力的解法,三层枚举
using namespace std;
int t,n,ans=0;
int main(){
cin>>t;
while(t--){
cin>>n;
ans=0;//花费的钱
for(int i=0;i<=n/150;i++){
for(int j=0;j<=n/200;j++){
for(int k=0;k<=n/350;k++){
int x=i*150+j*200+k*350;
if(x<=n&&x>ans){
ans=x;//找到尽可能多的花钱
}
}
}
}
cout<<n-ans<<endl;
}
return 0;
}
/* Problem: 坑爹的黑店
Language: C++ Result: 正确 Time: 2026-03-21 15:41:11
User: admin Problem: 1207 contest_id: 0*/
#include<iostream>
using namespace std;
int a,b,c;
int main(){
cin>>a>>b>>c;
if(c-a==2) cout<<0;
else if(b-a==2 || c-b==2) cout<<1;
else cout<<2;
cout<<endl;
cout<<max(c-b-1,b-a-1);
return 0;
}
/*
最小移动次数只有3种情况:
0次,c-a==2
1次,b-a==2 或 c-b==2
2次,所有剩余情况
最大移动次数:
max(c-b-1,b-a-1)
*/
/* Problem: 小马移动
Language: C++ Result: 正确 Time: 2026-03-21 15:32:35
User: admin Problem: 2534 contest_id: 0*/
#include<iostream>
#include<cstring>
using namespace std;
char a;
int b[200],mx=0;//b[i]表示字符i出现的次数
int main(){
while(cin>>a){
if(a>='A'&&a<='Z') b[a]++;//统计字符出现次数
}
for(char i='A';i<='Z';i++) mx=max(mx,b[i]);//最多次数(最高柱状图)
for(int i=mx;i>=1;i--){ //最多为mx行
for(char j='A';j<='Z';j++)
if(b[j]>=i) printf("* ");
else printf(" ");//模拟,是可以输出的就输出*,否则跳过
printf("\n"); //换行
}
for(char i='A';i<='Z';i++) printf("%c ",i);//输出a~z
return 0;
}
/* Problem: 柱状图
Language: C++ Result: 正确 Time: 2026-03-21 14:47:10
User: admin Problem: 2377 contest_id: 0*/
#include<iostream>
#include<string>
using namespace std;
string a;
int b[200],mx=0;//b[i]表示字符i出现的次数
int main(){
for(int i=0;i<4;i++){//一共4句
getline(cin,a);//getline读入带空格字符串
int len=a.size();
for(int j=0;j<len;j++)
if(a[j]>='A'&&a[j]<='Z')
b[a[j]]++;//统计字符出现次数
}
for(char i='A';i<='Z';i++) mx=max(mx,b[i]);//最多次数(最高柱状图)
for(int i=mx;i>=1;i--){ //最多为mx行
for(char j='A';j<='Z';j++)
if(b[j]>=i) printf("* ");
else printf(" ");//模拟,是可以输出的就输出*,否则跳过
printf("\n"); //换行
}
for(char i='A';i<='Z';i++) printf("%c ",i);//输出a~z
return 0;
}
/* Problem: 柱状图
Language: C++ Result: 正确 Time: 2026-03-21 14:45:05
User: admin Problem: 2377 contest_id: 0*/
#include<iostream>
#include<cstring>
using namespace std;
char a[210];
int b[200],mx=0;//b[i]表示字符i出现的次数
int main(){
for(int i=0;i<4;i++){//一共4句
fgets(a,sizeof(a),stdin);//fgets读入带空格字符串
int len=strlen(a);
for(int j=0;j<len;j++)
if(a[j]>='A'&&a[j]<='Z')
b[a[j]]++;//统计字符出现次数
}
for(char i='A';i<='Z';i++) mx=max(mx,b[i]);//最多次数(最高柱状图)
for(int i=mx;i>=1;i--){ //最多为mx行
for(char j='A';j<='Z';j++)
if(b[j]>=i) printf("* ");
else printf(" ");//模拟,是可以输出的就输出*,否则跳过
printf("\n"); //换行
}
for(char i='A';i<='Z';i++) printf("%c ",i);//输出a~z
return 0;
}
/* Problem: 柱状图
Language: C++ Result: 正确 Time: 2026-03-21 14:43:36
User: admin Problem: 2377 contest_id: 0*/
#include<iostream>
using namespace std;
int T,p;
int main(){
cin>>T;
while(T--){ //循环T次
cin>>p;
if(p<=10) cout<<"R\n";
else if(p>10&&p<=20) cout<<"L\n";
else cout<<p<<"\n";
}
return 0;
}
/* Problem: 手机电量显示
Language: C++ Result: 正确 Time: 2026-03-21 14:32:19
User: admin Problem: 4812 contest_id: 0*/
#include<iostream>
using namespace std;
int main(){
int x,y;
cin>>x>>y;
if(x<60&&y>=60){
cout<<1;
}else if(x>=60&&y<60){
cout<<1;
}else{
cout<<0;
}
return 0;
}
/* Problem: 有一门课不及格的学生
Language: C++ Result: 正确 Time: 2026-03-20 19:06:49
User: admin Problem: 1620 contest_id: 0*/
#include<iostream>
using namespace std;
int x,y;
int main(){
cin>>x;
if(x<0) y=-1;
if(x==0) y=0;
if(x>0) y=1;
cout<<y;
return 0;
}
/* Problem: 分段函数求值2
Language: C++ Result: 正确 Time: 2026-03-20 19:02:51
User: admin Problem: 1063 contest_id: 0*/
#include<iostream>
using namespace std;
int n,l,r,ans=0;
bool check(int x){//功能:判断x是幂和数,则返回true;否则,返回false
for(int i=1;i<=x;i*=2){//枚举第一个加数2的次幂:1 2 4 8 ...
for(int j=1;j<=x;j*=2){//枚举第二个加数2的次幂:1 2 4 8 ...
if(i+j==x) return true;
}
}
return false;
}
int main(){
cin>>l>>r;
for(int i=l;i<=r;i++){//判断i是否是幂和数
if(check(i)){
ans++;
}
}
cout<<ans;
return 0;
}
/* Problem: 幂和数
Language: C++ Result: 正确 Time: 2026-03-15 15:53:55
User: admin Problem: 4445 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
cin>>n;
for(int a=1;a<=n;a++){
for(int b=a;b<=n;b++){//不降原则,避免重复枚举
if(a*b%2==0){//是否合法
ans++;//三角形个数计数
}
}
}
cout<<ans;
return 0;
}
/* Problem: 数三角形
Language: C++ Result: 正确 Time: 2026-03-15 15:31:54
User: admin Problem: 4444 contest_id: 0*/
#include<iostream>//解法3:用数组打表,但是数组意义区别与解法2
using namespace std;
int y,m,d,ans=0;
int r[]={0,31,60,91,121,152,182,213,244,274,305,335,366};
int p[]={0,31,59,90,120,151,181,212,243,273,304,334,365};
int main(){
cin>>y>>m>>d;
if(y%100!=0&&y%4==0 || y%400==0) ans+=r[m-1];//闰年
else ans+=p[m-1];//平年
cout<<ans+d;
return 0;
}
/*
输入y m d
1、这一年已经过了m-1个月,统计前面m-1个月的天数 ans
2、加上第m个月的天数d, ans+=d
*/
/* Problem: 一年中的第几天
Language: C++ Result: 正确 Time: 2026-03-15 15:15:37
User: admin Problem: 1081 contest_id: 0*/
#include<iostream>//解法2:用数组打表
using namespace std;
int y,m,d,ans=0;
int r[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int p[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
cin>>y>>m>>d;
for(int i=1;i<=m-1;i++){//这一年已经过了m-1个月
//计算第i个月的天数
if(y%100!=0&&y%4==0 || y%400==0) ans+=r[i];//闰年
else ans+=p[i];//平年
}
cout<<ans+d;
return 0;
}
/*
输入y m d
1、这一年已经过了m-1个月,统计前面m-1个月的天数 ans
2、加上第m个月的天数d, ans+=d
*/
/* Problem: 一年中的第几天
Language: C++ Result: 正确 Time: 2026-03-15 15:12:21
User: admin Problem: 1081 contest_id: 0*/
#include<iostream>
using namespace std;
int y,m,d,ans=0;
int main(){
cin>>y>>m>>d;
for(int i=1;i<=m-1;i++){//这一年已经过了m-1个月
//计算第i个月的天数
if(i==2){//2月
if(y%100!=0&&y%4==0 || y%400==0) ans+=29;//闰年
else ans+=28;//平年
}else if(i==4 || i==6 || i==9 || i==11){//小月
ans+=30;
}else{//大月
ans+=31;
}
}
cout<<ans+d;
return 0;
}
/*
输入y m d
1、这一年已经过了m-1个月,统计前面m-1个月的天数 ans
2、加上第m个月的天数d, ans+=d
*/
/* Problem: 一年中的第几天
Language: C++ Result: 正确 Time: 2026-03-15 15:03:30
User: admin Problem: 1081 contest_id: 0*/
#include<iostream> //解法2:用函数
using namespace std;
int v,d,ans=0;
void f(){
ans=0; //多组数据,初始化答案为0
for(int i=1;;i++){//不确定多少轮
for(int j=1;j<=i;j++){//第i轮,滴i下
v-=d; //药水减少d
ans++;//+1秒
if(v<=0){ //药水滴完啦
cout<<ans<<endl;
return;//函数结束
}
}
ans++;//滴完一轮,等待1秒
}
}
int main(){
while(cin>>v>>d){
f(); //调用函数
}
return 0;
}
/*
1、理解题意
2、模拟打点滴的过程
*/
/* Problem: 挂盐水
Language: C++ Result: 正确 Time: 2026-03-15 14:52:10
User: admin Problem: 1512 contest_id: 0*/
#include<iostream>
using namespace std;
int v,d,ans=0;
int main(){
while(cin>>v>>d){
ans=0; //多组数据,初始化答案为0
for(int i=1;;i++){//不确定多少轮
for(int j=1;j<=i;j++){//第i轮,滴i下
v-=d; //药水减少d
ans++;//+1秒
if(v<=0){ //药水滴完啦
cout<<ans<<endl;
break;
}
}
if(v<=0) break; //药水滴完啦,说明已经输出答案了
ans++;//滴完一轮,等待1秒
}
}
return 0;
}
/* Problem: 挂盐水
Language: C++ Result: 正确 Time: 2026-03-15 14:49:59
User: admin Problem: 1512 contest_id: 0*/
#include <iostream>
using namespace std;
int a,s,d,f;
int main() {
cin>>a>>s>>d>>f;
if(a>=90&&s>=90&&f>=85 || a>=90&&d>=90&&f>=85 || s>=90&&d>=90&&f>=85)
cout<<"Qualified";
else
cout<<"Not qualified";
return 0;
}
/* Problem: 竞选班长
Language: C++ Result: 正确 Time: 2026-03-15 14:38:01
User: admin Problem: 1967 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
while(cin>>n){
ans=0; //结果初始化为0
while(n){//拆数字n
int g=n%10;//取出个位
n/=10;//抹掉个位
if(g%2==0) ans+=g; //拆出来的数字是偶数
}
cout<<ans<<endl<<endl;
}
return 0;
}
/* Problem: 奇怪的信
Language: C++ Result: 正确 Time: 2026-03-15 14:36:35
User: admin Problem: 1507 contest_id: 0*/
#include<iostream>
using namespace std;
int a,b,c,d,cnt=0;
int main(){
cin>>a>>b>>c>>d;
if(a>=90) cnt++;//cnt用于计数
if(b>=90) cnt++;
if(c>=90) cnt++;
if(cnt>=2&&d>=85){
cout<<"Qualified";
}else{
cout<<"Not qualified";
}
return 0;
}
/* Problem: 竞选班长
Language: C++ Result: 正确 Time: 2026-03-15 14:30:53
User: admin Problem: 1967 contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,k;
double a[100010],b[100010],p,q,ans;
bool cmp(double d1,double d2){
return d1>d2;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
sort(a+1,a+n+1,cmp);
sort(b+1,b+n+1,cmp);
int i=0,j=0;//双指针
while(i<=n&&j<=n){
if(p<=q){
i++;
p+=a[i];
}else{
j++;
q+=b[j];
}
double s=min(p,q)-k*(i+j);
ans=max(ans,s);
}
while(i<=n){//a数组要继续取数
i++;
p+=a[i];
double s=min(p,q)-k*(i+j);
ans=max(ans,s);
}
while(j<=n){//b数组要继续取数
j++;
q+=b[j];
double s=min(p,q)-k*(i+j);
ans=max(ans,s);
}
printf("%.5lf",ans);
return 0;
}
/*
5 8
1 2 3 4 5
3 4 5 6 7
0.00000
A的和p,B的和是q,指针i,j分别指向A B已经取到的数字
如果p<=q:i++
否则: j++
注意:有可能A或B已经取完,对应的B或A还剩下一些数字,那么要继续取完
*/
/* Problem: 最大得分
Language: C++ Result: 正确 Time: 2026-03-14 20:32:58
User: admin Problem: 2778 contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,k;
double a[100010],b[100010],p,q,ans;
bool cmp(double d1,double d2){
return d1>d2;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
sort(a+1,a+n+1,cmp);
sort(b+1,b+n+1,cmp);
for(int i=0,j=0;i<=n&&j<=n;){
if(p<=q){
i++;
p+=a[i];
}else{
j++;
q+=b[j];
}
double s=min(p,q)-k*(i+j);
ans=max(ans,s);
}
printf("%.5lf",ans);
return 0;
}
/* Problem: 最大得分
Language: C++ Result: 正确 Time: 2026-03-14 20:20:42
User: admin Problem: 2778 contest_id: 0*/
#include<bits/stdc++.h>
using namespace std;
int n,k;
double sum1=0,ans=-1e6,sum2=0;
double a[100005], b[100005];
bool cmp(double x,double y){
return x>y; //从大到小枚举
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++) cin>>b[i];
sort(b+1,b+n+1,cmp);
int i=0,j=0;//两个数组下标,双指针
while(i<=n&&j<=n){//使较小的那个sum尽可能大
if(sum1<=sum2){//A和小,则取A
i++;
sum1+=a[i];
}else{//B和小,则取B
j++;
sum2+=b[j];
}
double ss=min(sum1,sum2)-k*(i+j);
ans=max(ans,ss);//取当前结果比较
}
while(i<=n){ //第1个数列还有数
i++;
sum1+=a[i];
double ss=min(sum1,sum2)-k*(i+j);
ans=max(ans,ss);//取当前结果比较
}
while(j<=n){ //第2个数列还有数
j++;
sum2+=b[j];
double ss=min(sum1,sum2)-k*(i+j);
ans=max(ans,ss);//取当前结果比较
}
printf("%.5lf",ans);
return 0;
}
/* Problem: 最大得分
Language: C++ Result: 正确 Time: 2026-03-14 20:01:00
User: admin Problem: 2778 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[2020],f[2020],g[2020],mx1=1,mx2=1;
//f[i]表示从前往后以i结尾的最长不上升子序列的长度
//g[i]表示从后往前以i结尾的最长不下降子序列的长度
//答案就是以任意位置i分开成两个子序列,左侧最大值+右侧最大值
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
f[i]=1;
for(int j=1;j<i;j++){//i是否可以续在j的后面
if(a[i]<=a[j]){//最长不上升子序列
f[i]=max(f[i],f[j]+1);
}
}
}
for(int i=n;i>=1;i--){
g[i]=1;
for(int j=i+1;j<=n;j++){//最长不下降
if(a[i]>=a[j]){
g[i]=max(g[i],g[j]+1);
}
}
}
for(int i=1;i<=n;i++) f[i]=max(f[i],f[i-1]);//计算f[i]的前缀最大值
for(int i=n;i>=1;i--) g[i]=max(g[i],g[i+1]);//计算g[i]的后缀最大值
for(int i=1;i<=n;i++){//以i为分割点:1~i i+1~n 分成两个子序列
ans=max(ans,f[i]+g[i+1]);
}
cout<<ans;
return 0;
}
/* Problem: 重启系统
Language: C++ Result: 正确 Time: 2026-03-14 19:26:40
User: admin Problem: 2301 contest_id: 0*/
#include<iostream>
using namespace std;
int n,k,ans=0,a[2020],f[2020],g[2020],mx1=1,mx2=1;
//f[i]表示从第k个位置从后往前,包含第k个元素,以i结尾的最长下降子序列的长度
//g[i]表示从第k个位置从前往后,包含第k个元素,以i结尾的最长上升子序列的长度
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
f[k]=1;g[k]=1;//状态初始值
for(int i=k-1;i>=1;i--){//以k开头从后往前
for(int j=i+1;j<=k;j++){//第i个位置是否可以续在位置j前面
if(f[j]&&a[i]<a[j]){
f[i]=max(f[i],f[j]+1);
}
}
mx1=max(mx1,f[i]);
}
for(int i=k+1;i<=n;i++){//以k开头从前往后
for(int j=k;j<=i-1;j++){//第i个位置是否可以续在位置j后面
if(g[j]&&a[i]>a[j]){
g[i]=max(g[i],g[j]+1);
}
}
mx2=max(mx2,g[i]);
}
cout<<mx1+mx2-1;
return 0;
}
/* Problem: 包含第k个元素的最长上升子序列
Language: C++ Result: 正确 Time: 2026-03-14 18:48:49
User: admin Problem: 1497 contest_id: 0*/
#include<iostream>
#include<iomanip>//使用setprecision,需要该头文件
using namespace std;
double v,g,m,n,a,b;//定义变量
int main(){
cin>>v>>g>>m>>n;
a=v*0.5;//按体积计算的费用a
if(g<300){//按重量计算的费用b
b=m;
}else{
b=n;
}
if(a<b) printf("%.1lf",a);//cout<<setprecision(1)<<fixed<<a;
else printf("%.1lf",b);//cout<<setprecision(1)<<fixed<<b;
return 0;
}
/* Problem: 小杨的爱心快递.
Language: C++ Result: 正确 Time: 2026-03-14 11:36:35
User: admin Problem: 4811 contest_id: 0*/
#include<bits/stdc++.h>
using namespace std;
int n,k;
double sum1=0,ans=0,sum2=0;
double a[100005], b[100005];
bool cmp(double x,double y){
return x>y; //从大到小枚举
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++) cin>>b[i];
sort(b+1,b+n+1,cmp);
int i=0,j=0;//两个数组下标,双指针
while(i<=n&&j<=n){//使较小的那个sum尽可能大
if(sum1<=sum2){//A和小,则取A
i++;
sum1+=a[i];
}else{//B和小,则取B
j++;
sum2+=b[j];
}
double ss=min(sum1,sum2)-k*(i+j);
ans=max(ans,ss);//取当前结果比较
}
while(i<=n){ //第1个数列还有数
i++;
sum1+=a[i];
double ss=min(sum1,sum2)-k*(i+j);
ans=max(ans,ss);//取当前结果比较
}
while(j<=n){ //第2个数列还有数
j++;
sum2+=b[j];
double ss=min(sum1,sum2)-k*(i+j);
ans=max(ans,ss);//取当前结果比较
}
printf("%.5lf",ans);
return 0;
}
/* Problem: 最大得分
Language: C++ Result: 正确 Time: 2026-03-14 11:02:21
User: admin Problem: 2778 contest_id: 0*/
#include<iostream>
using namespace std;
int t,p,r,n,ans;
int main(){
cin>>t;
for(int i=1;i<=t;i++){
int p;
cin>>p;
if(p<=10){
cout<<'R'<<endl;
}else if(p>10 && p<=20){
cout<<'L'<<endl;
}else{
cout<<p<<endl;
}
}
return 0;
}
/* Problem: 手机电量显示
Language: C++ Result: 正确 Time: 2026-03-14 10:30:24
User: admin Problem: 4812 contest_id: 0*/
#include<iostream>
using namespace std;
int n,t=0,ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){//枚举1~n的每一个数字
for(int j=1;j<=i;j++){//循环枚举从1~i
ans+=j;
}
}
cout<<ans;
return 0;
}
/*
第1轮在ans中:+1
第2轮在ans中:+1+2
第3轮在ans中:+1+2+3
...
第n轮在ans中:+1+2+3+...+n
所以,可以用嵌套循环累加
*/
/* Problem: 累计相加.
Language: C++ Result: 正确 Time: 2026-03-14 10:01:05
User: admin Problem: 4040 contest_id: 0*/
#include<iostream>
using namespace std;
double x,y; //全局变量,默认初始化为0
int main(){
scanf("%lf",&x); //输入小数
if(x<1){ //如果x<1
y=x;
}else if(1<=x&&x<10){ //否则如果 1<=x与x<10
y=2*x-1;
}else{ //不写否则如果,表示x的其他情况都是这个分支
y=3*x-11;
}
printf("y=%.2lf",y); //%lf 小数的占位符
return 0;
}
/* Problem: 分段函数求值
Language: C++ Result: 正确 Time: 2026-03-13 19:40:21
User: admin Problem: 1050 contest_id: 1282*/
#include<iostream>
#include<iomanip> //setprecision的头文件
using namespace std;
double x,y; //全局变量,默认初始化为0
int main(){
cin>>x;//输入
if(x<1){//如果x<1
y=x;
}else if(1<=x&&x<10){ //否则如果 1<=x与x<10
y=2*x-1;
}else if(x>=10){//否则如果 x>=10
y=3*x-11;
}
cout<<"y="<<setprecision(2)<<fixed<<y;
return 0;
}
/* Problem: 分段函数求值
Language: C++ Result: 正确 Time: 2026-03-13 19:34:41
User: admin Problem: 1050 contest_id: 0*/
#include<iostream>
using namespace std;
double x,y; //全局变量,默认初始化为0
int main(){
scanf("%lf",&x); //输入小数
if(x<1){
y=x;
}else if(1<=x&&x<10){
y=2*x-1;
}else if(x>=10){
y=3*x-11;
}
printf("y=%.2lf",y); //%lf 小数的占位符
return 0;
}
/* Problem: 分段函数求值
Language: C++ Result: 正确 Time: 2026-03-13 19:26:18
User: admin Problem: 1050 contest_id: 0*/
#include<iostream>
using namespace std;
int y,m,d,h,k;
int main(){
cin>>y>>m>>d>>h>>k;
h+=k;//小时累加
if(h>=24){//小时需要进位
h-=24;
d++; //小时进位,日子+1
}
//判断日期是否需要进位:分三类讨论 2月 小月 大月
if(m==2){
if(y%100!=0&&y%4==0 || y%400==0){//闰年
if(d>29){
d-=29;
m++;//日期进位,月份+1
}
}else{//平年
if(d>28){
d-=28;
m++;//日期进位,月份+1
}
}
}else if(m==4 || m==6 || m==9 || m==11){
if(d>30){//小月
d-=30;
m++;//日期进位,月份+1
}
}else{//大月
if(d>31){
d-=31;
m++;//日期进位,月份+1
}
}
if(m>12){//判断月份是否需要进位
m-=12;
y++;//月份进位,年份+1
}
cout<<y<<" "<<m<<" "<<d<<" "<<h;
return 0;
}
/* Problem: 时间跨越.
Language: C++ Result: 正确 Time: 2026-03-08 16:18:00
User: admin Problem: 4357 contest_id: 0*/
#include<iostream>
using namespace std;
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){ //表示一共有n行
for(int j=1;j<=m;j++){//表示第i行一共有m列
cout<<i*j<<" ";
}
cout<<endl; //第i行输出结束
}
return 0;
}
/* Problem: 等差矩阵.
Language: C++ Result: 正确 Time: 2026-03-08 16:17:39
User: admin Problem: 4356 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0,a[110],f[110],g[110];
//f[i]表示1~i区间中以i结尾的最长上升子序列
//g[i]表示n~i区间中以i几位的最长上升子序列
//答案:n-max(f[i]+g[i]-1)
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){//从前往后推
f[i]=1;//初始化状态
for(int j=1;j<i;j++){
if(a[j]<a[i]){
f[i]=max(f[i],f[j]+1);
}
}
}
for(int i=n;i>=1;i--){//从后往前推
g[i]=1;//初始化状态
for(int j=n;j>i;j--){
if(a[j]<a[i]){
g[i]=max(g[i],g[j]+1);
}
}
}
for(int i=1;i<=n;i++){
ans=max(ans,f[i]+g[i]-1);//第i个人在队伍中被计算了2次
}
cout<<n-ans;
return 0;
}
/* Problem: 合唱队形
Language: C++ Result: 正确 Time: 2026-03-07 19:58:32
User: admin Problem: 1307 contest_id: 0*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,ans=0;
struct node{
int x,y,sum;//x和y依次表示南北坐标,sum表示以该桥结尾的最多不相交的桥的数量
}a[10010]; //状态定义:a[i].sum表示以第i座桥结尾的最多不相交的桥的数量
bool cmp(node n1,node n2){
if(n1.x==n2.x) return n1.y<n2.y;
return n1.x<n2.x;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
sort(a+1,a+n+1,cmp);//排序
for(int i=1;i<=n;i++){
a[i].sum=1;//初始化状态
for(int j=1;j<i;j++){//判断桥i是否可以续在桥j的后面
if(a[i].y>a[j].y){
a[i].sum=max(a[i].sum,a[j].sum+1);//状态转移
}
}
ans=max(ans,a[i].sum);
}
cout<<ans;
return 0;
}
/* Problem: 友好城市
Language: C++ Result: 正确 Time: 2026-03-07 19:34:42
User: admin Problem: 1308 contest_id: 0*/
#include<iostream>
#include<stack>
using namespace std;
int n,ans=0,a[1010],f[1010],rec[1010];
//rec[i]表示位置i续在 rec[i] 的后面
stack<int> st;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
f[i]=1; //初始化状态
for(int j=1;j<i;j++){//状态转移,需要判断i位置是否可以续在j位置的后面
if(a[j]<=a[i]){//位置i可以续在位置j的后面
if(f[i]<f[j]+1){//当f[i]第一次被更新成一个更大的值的时候,存储从位置j过来的
rec[i]=j;
f[i]=f[j]+1;
}
}
}
ans=max(ans,f[i]);
}
cout<<ans<<endl;
int last=0;
for(int i=1;i<=n;i++){
if(f[i]==ans){//第一个最大值的位置
last=i;
break;
}
}
for(int i=last;i;i=rec[i]){
st.push(i);//从后往前找到最长不下降子序列的下标位置
}
while(st.size()){
cout<<a[st.top()]<<" ";
st.pop();//从栈顶到栈底依次输出
}
return 0;
}
/* Problem: 最长不下降子序列
Language: C++ Result: 正确 Time: 2026-03-07 19:08:00
User: admin Problem: 1304 contest_id: 0*/
#include<iostream>
using namespace std;
string s;
int main(){
cin>>s;
int len=s.size();
if(len%2==1){//1 字符串长度是奇数
if(s[len/2]!='0' && s[len/2]!='1' && s[len/2]!='8'){//直接判断最中间的字符只能是0 或 1 或 8
cout<<"Not a strobogrammatic number";//不符合对称要求
return 0;
}
}
for(int i=0,j=len-1;i<j;i++,j--){//2 类似回文串:左右指针,逐个字符判断
if(s[i]=='0'&&s[j]=='0' || s[i]=='1'&&s[j]=='1' || s[i]=='8'&&s[j]=='8' || s[i]=='6'&&s[j]=='9' || s[i]=='9'&&s[j]=='6'){//对称
}else{
cout<<"Not a strobogrammatic number";//不符合对称要求
return 0;
}
}
cout<<"Strobogrammatic number";
return 0;
}
/*
1 字符串长度是奇数:最中间的字符只能是0 或 1 或 8
2 类似回文串:左右指针,逐个字符判断
(和回文串不一样的是:左右是0 或 1 或 8 可以,还有左6右9 或 左9右6 也可以)
*/
/* Problem: 中心对称数.
Language: C++ Result: 正确 Time: 2026-03-07 16:46:41
User: admin Problem: 2014 contest_id: 0*/
#include<iostream>
using namespace std;
int n,sum=0;
int main(){
cin>>n;
for(int i=1;;i++){//枚举:i表示总共有多少家
sum+=i;//总共i家的门牌号之和
for(int j=1;j<=i;j++){//枚举我家的门牌号
if(sum-j*3==n){//恰好满足题意
cout<<j<<" "<<i;
return 0;
}
}
}
return 0;
}
/* Problem: 我家的门牌号.
Language: C++ Result: 正确 Time: 2026-03-07 16:31:11
User: admin Problem: 1676 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
while(cin>>n){
if(n==0) break;
ans=0;//注意多组数据,答案要初始化
while(n>=3){
ans+=n/3;//换串串
n=n/3+n%3;//剩下的签子
}
if(n==2) ans++;//借1根签,然后还掉
cout<<ans<<endl;
}
return 0;
}
/* Problem: 换串串.
Language: C++ Result: 正确 Time: 2026-03-07 16:24:45
User: admin Problem: 2475 contest_id: 0*/
#include<iostream>
using namespace std;
int k,n,ans=0,a[30][30];
bool check(int x,int y){//函数功能:检查奶牛x和y是否符合一致性
bool flag=a[1][x]>a[1][y]; //第1次训练中,x和y的名次比较
for(int i=2;i<=k;i++){
if(a[i][x]>a[i][y] != flag) return false;//比较结果和第1次训练不一致
}
return true;
}
int main(){
cin>>k>>n;
for(int i=1;i<=k;i++){//i表示第i次训练
for(int j=1;j<=n;j++){//j表示名次
int x;
cin>>x;//x表示的是奶牛编号,不是名次
a[i][x]=j; //a[i][x]表示第i次训练第x号奶牛是 j 名
}
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){//两两枚举一对奶牛,注意避免重复
if(check(i,j)){
//cout<<i<<" "<<j<<endl;
ans++;//奶牛i和j是一致的,那么答案+1
}
}
}
cout<<ans;
return 0;
}
/* Problem: 体操训练.
Language: C++ Result: 正确 Time: 2026-03-07 15:54:09
User: admin Problem: 2495 contest_id: 0*/
#include<iostream>
using namespace std;
int n,k,sum=0,len[1010];//sum表示当前行的字符个数,len[i]表示第i个单词的字符个数
string s[1010];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>s[i],len[i]=s[i].size();
for(int i=1;i<=n;i++){
cout<<s[i]<<' ';
sum+=len[i];//累加当前已经输出单词的长度
if(sum+len[i+1]>k){//字符个数>k,那么下一个单词就需要另起一行输出
cout<<endl;//换行
sum=0;//字符个数归零
}
}
return 0;
}
/*
依次输出,单词中间用空格隔开。
在输出时,需要统计当前行已经输出的字符个数:
1、如果字符个数<=k,那么单词可以继续输出
2、如果字符个数>k,那么这个单词就需要另起一行输出。
*/
/* Problem: 作文排版.
Language: C++ Result: 正确 Time: 2026-03-07 15:28:48
User: admin Problem: 1887 contest_id: 0*/
#include<iostream>
using namespace std;
long long a,b,ans=0;
int main(){
cin>>a>>b;
if(a%2==0) a--;//如果开始是偶数面,那么-1变成奇数面
if(b%2==1) b++;//如果结束是奇数面,那么+1变成偶数面
cout<<(b-a+1)/2;//区间[a,b]是带走的,总面数/2 即 张数
return 0;
}
/* Problem: 考试秘籍.
Language: C++ Result: 正确 Time: 2026-03-07 15:18:15
User: admin Problem: 2124 contest_id: 0*/
#include<iostream>//解法二:暴力枚举12个月,代码较长
using namespace std;
int main(){
int y,a;//输入一个年份y、月份a,输出这个月的天数
cin>>y>>a;
if(a==1) cout<<31;
else if(a==2){
if(y%100!=0&&y%4==0 || y%400==0){//闰年
cout<<29;
}else{//平年
cout<<28;
}
}
else if(a==3) cout<<31;
else if(a==4) cout<<30;
else if(a==5) cout<<31;
else if(a==6) cout<<30;
else if(a==7) cout<<31;
else if(a==8) cout<<31;
else if(a==9) cout<<30;
else if(a==10) cout<<31;
else if(a==11) cout<<30;
else if(a==12) cout<<31;
return 0;
}
//算术运算 + - * / %
//逻辑运算 && || !
//比较运算 > < == 比如: a+b==10
//赋值运算 = 比如 a=11 a=b+c ,特别注意赋值运算符的左侧一定是一个变量
/* Problem: 这一年的该月有多少天
Language: C++ Result: 正确 Time: 2026-03-07 14:28:41
User: admin Problem: 1052 contest_id: 0*/
#include<iostream>
using namespace std;
int n,m,t,ans=0;//n行m列,t=0表示空心,t=1表示实心
char c;//图形上的字符c
int main(){
cin>>n>>m>>c>>t;
if(t==0){//空心
for(int i=1;i<=n;i++){//i表示:第1行到第n行
for(int j=1;j<=m;j++){//j表示:第i行循环m次,即第1列到第m列
if(i==1 || i==n || j==1 || j==m){//边框:第1行、第n行、第1列、第m列输出*
cout<<c; //输出指定字符
}else{//中间要空心,输出1个空格
cout<<" ";
}
}
cout<<endl;//第i行输出结束时,要换行
}
}else{//实心
for(int i=1;i<=n;i++){//i表示:第1行到第n行
for(int j=1;j<=m;j++){//j表示:第i行循环m次,即第1列到第m列
cout<<c; //输出指定字符
}
cout<<endl;//第i行输出结束时,要换行
}
}
return 0;
}
/* Problem: 画矩形
Language: C++ Result: 正确 Time: 2026-03-07 11:27:54
User: admin Problem: 1634 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){//i表示:第1行到第n行
for(int j=1;j<=n;j++){//j表示:第i行循环n次,即第1列到第n列
if(i==1 || i==n || j==1 || j==n){//边框:第1行、第n行、第1列、第n列输出*
cout<<"*";
}else{//中间要空心,输出1个空格
cout<<" ";
}
}
cout<<endl;//第i行输出结束时,要换行
}
return 0;
}
/* Problem: 空心正方形
Language: C++ Result: 正确 Time: 2026-03-07 11:22:40
User: admin Problem: 1911 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
cin>>n;
cout<<n;//先输出第一个数字
while(n!=1){
if(n%2==0){
cout<<"->"<<n/2;//输出变化过程
n/=2;
}else{
cout<<"->"<<n+1;//输出变化过程
n=n+1;
}
}
return 0;
}
/* Problem: 殊途同归—走向1的世界
Language: C++ Result: 正确 Time: 2026-03-07 11:10:46
User: admin Problem: 1097 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
while(scanf("%d",&n)){//当输入的数据个数不确定的时候,可以考虑循环输入
ans++;//计数
if(n==0){
break;//结束循环输入
}
}
printf("%d",ans);
return 0;
}
/* Problem: 0是第几个输入的数
Language: C++ Result: 正确 Time: 2026-03-07 11:01:06
User: admin Problem: 1092 contest_id: 0*/
#include<iostream>
using namespace std;
int n,ans=0;
int main(){
while(cin>>n){//当输入的数据个数不确定的时候,可以考虑循环输入
ans++;//计数
if(n==0){
break;//结束循环输入
}
}
cout<<ans;
return 0;
}
/* Problem: 0是第几个输入的数
Language: C++ Result: 正确 Time: 2026-03-07 10:58:26
User: admin Problem: 1092 contest_id: 0*/
#include<iostream>
using namespace std;
int x,y,ans=0;//离顶部距离为x,每分钟爬y米,然后下滑1米
int main(){
cin>>x>>y;
while(x>0){ //当x<=0的时候,就是已经爬出去了
//爬墙分两步: 每分钟爬y米,然后下滑1米
x-=y; //每分钟爬y米,离顶部距离 -y 米
ans++;//时间一分钟
if(x<=0) break;//注意:上爬后,需要立即判断是否已经出去了
x++; //然后下滑1米
ans++;//时间一分钟
}
cout<<ans;//爬墙时间
return 0;
}
/* Problem: 小虫爬墙
Language: C++ Result: 正确 Time: 2026-03-07 10:53:12
User: admin Problem: 1080 contest_id: 0*/
#include<iostream>
using namespace std;
int n;
int main(){
scanf("%d",&n);
while(n!=1){//循环条件:最后变成正整数值 1,会结束
if(n%2==0){ //若为偶数,则把它除以2
//cout<<n<<"/2="<<n/2<<endl; 注意比较两种输出方式
printf("%d/2=%d\n",n,n/2);
n/=2;
}else{//若为奇数,则把它乘以3加1
//cout<<n<<"*3+1="<<n*3+1<<endl;
printf("%d*3+1=%d\n",n,n*3+1);
n=n*3+1;
}
}
return 0;
}
/* Problem: 角谷猜想
Language: C++ Result: 正确 Time: 2026-03-07 10:32:31
User: admin Problem: 1079 contest_id: 0*/
#include<iostream> //解法1:枚举所有可能性
using namespace std;
int a;
int main(){
cin>>a;
if(a%3==0&&a%5==0&&a%7==0) cout<<"3 5 7";
else if(a%3==0&&a%5==0) cout<<"3 5";
else if(a%5==0&&a%7==0) cout<<"5 7";
else if(a%3==0&&a%7==0) cout<<"3 7";
else if(a%3==0) cout<<"3";
else if(a%5==0) cout<<"5";
else if(a%7==0) cout<<"7";
else cout<<"n";
return 0;
}
/* Problem: 判断能否被3,5,7整除
Language: C++ Result: 正确 Time: 2026-03-06 16:30:22
User: admin Problem: 1618 contest_id: 0*/
#include<iostream> //解法2
using namespace std;
int n;
int main(){
cin>>n;
if(n%3==0) cout<<"3 ";
if(n%5==0) cout<<"5 ";
if(n%7==0) cout<<"7 ";
if(n%3!=0&&n%5!=0&&n%7!=0) cout<<"n";
return 0;
}
/* Problem: 判断能否被3,5,7整除
Language: C++ Result: 正确 Time: 2026-03-06 16:28:04
User: admin Problem: 1618 contest_id: 0*/
#include<iostream>
using namespace std;
int year,month,day;
int main(){
scanf("%d%d", &year, &month);
switch(month){//枚举月份
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: day = 31; break;
case 4:
case 6:
case 9:
case 11: day = 30; break;
case 2:
if((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) day = 29;
else day = 28;
break;
}
printf("%d", day);
return 0;
}
/* Problem: 这一年的该月有多少天
Language: C++ Result: 正确 Time: 2026-03-06 16:24:56
User: admin Problem: 1052 contest_id: 0*/
#include<iostream>
#include<vector>
using namespace std;
int n,ans=0,dep[110],sum[110];
vector<int> vc[110];
int dfs(int x,int fa){//搜索结点x,它的父是fa,返回x家族的人数(子树x的大小)
sum[x]=1; //家族先算上自己
dep[x]=dep[fa]+1;
for(int i=0;i<vc[x].size();i++){//遍历x行的每个元素
if(vc[x][i]!=fa){//只能搜索儿子,不能搜索父亲
sum[x]+=dfs(vc[x][i],x); //搜索结点vc[x][i],父节点是x
}
}
return sum[x];//返回x家族的人数(子树x的大小)
}
int main(){
cin>>n;
for(int i=1;i<=n-1;i++){//n-1条边
int x,y;
cin>>x>>y;
vc[x].push_back(y);//双向建边,无向图
vc[y].push_back(x);
}
dfs(1,0);//从根节点1开始搜索,父节点为0
for(int i=1;i<=n;i++) cout<<sum[i]<<" "<<dep[i]<<endl;
return 0;
}
/* Problem: 子树的大小及深度
Language: C++ Result: 正确 Time: 2026-02-06 21:00:43
User: admin Problem: 2679 contest_id: 0*/