新生27场
数对:
我们有 A 和 B 两个正整数,同时如果能找到 n 和 m 两个正整数满足下面的条件:
注意:n 大于 m 或者 m 大于 n 或者 m 等于 n 都可以。
- n+ m = A
- n × m= B
注意:n 大于 m 或者 m 大于 n 或者 m 等于 n 都可以。
输入
输入的第一行是一个整数 T,表示 A 和 B 的组数。
接下来 T 行,每行有两个整数 A 和 B。
接下来 T 行,每行有两个整数 A 和 B。
输出
输出有 T 行,对于每组 A 和 B,输出使得它们成为奇异数的正整数 n 和 m 有多少对。
样例输入 Copy
【输入样例1】 1 5 6 【输入样例2】 2 3 2 1000000000000 1 【输入样例3】 6 1908 444992 1925 553696 1881 878378 5460 514944 1172 268867 2652 702121
样例输出 Copy
【输出样例1】 2 【输出样例2】 2 0 【输出样例3】 2 2 2 2 2 0
提示
【样例1解释】
这里只有一组 A 和 B,满足条件的 n 和 m 有 2 对,分别是 n= 2,m = 3 和n= 3,m = 2 。
【样例2解释】
这里有 2 组 A,B,第 1 个答案是 2,第 2 个答案是 0。
【数据规模】
对于 100% 的数据,保证 1 ≤ A,B ≤ 1012,1 ≤ T ≤ 100。
这里只有一组 A 和 B,满足条件的 n 和 m 有 2 对,分别是 n= 2,m = 3 和n= 3,m = 2 。
【样例2解释】
这里有 2 组 A,B,第 1 个答案是 2,第 2 个答案是 0。
【数据规模】
对于 100% 的数据,保证 1 ≤ A,B ≤ 1012,1 ≤ T ≤ 100。
这个题吧,因为乘除法会有误差一开始我是拿的加法来写,结果超时。用乘法把数据都列出来才知道,可能会有不能整除的情况,但是除法只是保留了商的形式,就会容易多解,所以增加一个判断条件
还是超时。因为他数据两边是对称的,可以直接乘2,我当时第一次做就想到这个地方,答案是错的,就没继续下去了。。。但其实还有一个,就是不能直接乘2,平方数例如16就只有4*4一种情况
这个就是例外了,需要考虑。
#include<iostream> typedef long long int ll; using namespace std; int main(){ ll t; cin>>t; while(t--) { ll a,b,sum=0; cin>>a>>b; for(int i=1;i<=b/i;i++) { if(b%i==0&&i+b/i==a) { if(b/i==i) sum++; else sum+=2; } } cout<<sum<<endl; } }
兔子
从左往右有100000001个整数点,分别是整数点0至整数点100000000。有n只兔子,第i只兔子在整数点d[i]。你需要选择一个整数点作为喂食点,所有兔子都要走到这个整数点进食。应该如何选择喂食点,才能使得所有兔子走过的总路程最小?输出最小的总路程。
输入
第一行,一个整数。1<=n<=20。
第二行,共n个整数,第i个整数是d[i]。0<=d[i]<=100000000。
第二行,共n个整数,第i个整数是d[i]。0<=d[i]<=100000000。
输出
一个整数
样例输入 Copy
【样例1】
3
5 9 1
【样例2】
4
5 9 1 8
样例输出 Copy
【样例1】
8
【样例2】
11
提示
对于60%的数据, 1<=n<=3且0<=d[i]<=10。
对于80%的数据, 1<=n<=10且0<=d[i]<=100。
对于80%的数据, 1<=n<=10且0<=d[i]<=100。
我被这题骗到了啊啊啊啊。数据范围真的没那么大,我一开始开了10^8的数组,运行错误哈哈,但是你看,仔细读题仔细读题!
#include<iostream> #include<algorithm> #include<cmath> using namespace std; int a[10010]; int main(){ long long int n,sum=0; cin>>n; for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); if(n%2==1) { for(int i=1;i<=n;i++) sum=sum+abs(a[n/2+1]-a[i]); } else { for(int i=1;i<=n;i++) sum=sum+abs(a[i]-a[n/2]); } cout<<sum<<endl; return 0; }
糖果:
题目描述
有n个小朋友,有m袋糖果,第i袋的糖果数量是a[i]。已知n<=m<2n。每个小朋友至少要有一袋糖果,至多只能要两袋糖果。分配的目标是把这m袋糖果全部分完,而且要使得每个小朋友最终得到的糖果数量都是相等的。如果可以做到则输出”possible”,如果做不到则输出”impossible”。注意:不能拆开一个袋子的糖果,必须整袋整袋的分配。
输入
第一行,一个正整数R,表示有R组测试数据。1<=R<=10。
每组测试数据的格式是:
第一行,两个整数n和m。1<=n<=50。n<=m<2n。
第二行,m个整数,第i个整数是a[i]。1<=a[i]<=1000。
每组测试数据的格式是:
第一行,两个整数n和m。1<=n<=50。n<=m<2n。
第二行,m个整数,第i个整数是a[i]。1<=a[i]<=1000。
输出
共R行,每行一个字符串,”possible”或者”impossible”,双引号不用输出。
样例输入 Copy
4
1 1
47
3 5
10 8 10 1 1
3 5
3 9 10 7 1
6 11
1 1 1 2 1 1 1 1 1 1 1
样例输出 Copy
possible impossible possible possible
这题一位大佬的想法很巧妙啊,每个小朋友分得的糖果数是一样的,且最多是两袋,这句话很关键。在A数组里面直接看数量,如果是奇数个(不可能为一袋,一袋在第一轮就已经分好了),所以在第二轮就是只能两袋两袋来
分,直接看是不是2的倍数就好了,如果是,排序之后,再看看是否可以均分,每个小朋友分得的糖果数一样。
#include<iostream> #include<vector> #include<algorithm> typedef long long int ll; using namespace std; int c[1000010]; int main(){ int t; cin>>t; while(t--) { int a,b,sum=0; cin>>a>>b; vector<int> A; for(int i=0;i<b;i++) { cin>>c[i]; sum=sum+c[i]; } if((sum%a)!=0) cout<<"impossible"<<endl; else { ll ave=sum/a; for(int i=0;i<b;i++) { if(c[i]!=ave) A.push_back(c[i]); } int len=A.size(); if((len%2)==1) cout<<"impossible"<<endl; else { int flat=1; sort(A.begin(),A.end()); for(int i=0;i<len;i++) { if(A[i]+A[len-i-1]!=ave) { flat=0; cout<<"impossible"<<endl; break; } } if(flat) cout<<"possible"<<endl; } } A.clear(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具