王老师的首尾最大数
文件 IO比赛题目
时间限制: 1000MS空间限制: 256MB
题目描述
为了出题目,王老师新定义了一个概念——首尾数
对于一个数字而言,将它的第一位和最后一位数字相加,就是它的 首尾数
现在王老师给出 n 个数字,请你找出其中 首尾数 最大的数字
如果存在多个 首尾数 最大的数字,请输出本身数字最小的那个数字
输入格式
输入第一行包含一个整数 n 表示数字数量
输入第二行包含 n 个整数,分别表示每个数 ai
输出格式
按题目要求输出答案
样例输入 1
3 3 456 78
样例输出 1
78
样例输入 2
5 418 523 666 32999 6
样例输出 2
6
提示/说明
数据范围
对于 100% 的数据 1≤n≤1000,1≤ai≤100000
样例解释
3 的首尾数为 3+3=6
456 的首尾数为 4+6=10
78 的首尾数为 7+8=15
所以首尾数最大的是 78
样例解释2
418,666,32999,6 的首尾数都是 12,6 是其中最小的数字
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
freopen("num.in","r",stdin);
freopen("num.out","w",stdout);
int n;
cin >> n;
int ans = LLONG_MAX;
int mx = -1;
while(n--){
string s;
cin >> s;
int a = (s[0] - '0') + (s[s.size() - 1] - '0');
int num = stoi(s);
if(a > mx){
mx = a;
ans = num;
}
else if(a == mx){
if(num < ans){
ans = num;
}
}
}
cout << ans;
return 0;
}
王老师的组队比赛
文件 IO比赛题目
时间限制: 1000MS空间限制: 256MB
题目描述
王老师准备从新的集训队中选拔一部分同学去参加天梯赛
班级里一共有 n 名同学,但是这 n 名同学的关系有好有坏,有些同学之间关系非常好,而有些同学之间可能存在矛盾或冲突。
为了确保队伍的和谐与比赛的成绩,王老师决定从这些同学中选拔尽可能多且不会产生矛盾的同学去参加比赛,毕竟就算每个人只会做送分题,十个人也有 1000 分!
现在王老师统计了 m 条关系,每条关系用两个编号 x,y 表示,表示 x 和 y 同学存在矛盾,不能同时选这两位同学去参赛
现在王老师想知道,最多可以选择多少人去参加比赛?
输入格式
输入第一行包含两个整数 n,m,含义如题
接下来 m 行,每行包含两个整数 x,y,表示两位有矛盾的同学
输出格式
输出第一行包含一个整数表示最多选多少同学参赛
第二行从小到大依次输出被选同学的编号,如果存在多组不同的方案,则输出字典序最小的那组
样例输入 1
7 10 1 2 1 4 2 4 2 3 2 5 2 6 3 5 3 6 4 5 5 6
样例输出 1
3 1 3 7
提示/说明
数据范围
一共 10 组测试数据
其中编号 1∼2 的数据满足:m=0;
其中编号 3∼4 的数据满足:m=(n∗(n−1))/2;
对于所有的数据满足 n≤20,m≤100,且关系不会出现重复((2,4)(4,2) 这两组关系也属于重复)
代码(优化到极致最后一个点也wa/)
#include<bits/stdc++.h>
using namespace std;
#define int long long
bool a[105][105];
vector<int>cnt;
signed main(){
freopen("race.in","r",stdin);
freopen("race.out","w",stdout);
int n,m;cin>>n>>m;
int ans=0;
while(m--){
int x,y;
cin>>x>>y;
a[x][y]=1;
a[y][x]=1;
}
for(int i = 1; i< (1 << n); i++){
vector<int>v;
for(int j = 0; j < n; j++){
if((i >> j) & 1){
v.push_back(j+1);
}
}
bool f=1;
for(int k=0;k<v.size();k++){
for(int j=k+1;j<v.size();j++){
if(a[v[k]][v[j]]==1){
f=0;
break;
}
}
}
if(f&&v.size()>ans){
ans=v.size();
cnt=v;
}
}
cout<<ans<<"\n";
for(auto x:cnt){
cout<<x<<" ";
}
return 0;
}
代码(dfs)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[110][110],b[110],n,m,u,v,cnt,res1[110],res2[110];
void dfs(int x){
if(x-1>cnt){
cnt=x-1;
memset(res2,0,sizeof(res2));
for(int i=1;i<=cnt;++i)res2[res1[i]]=1;
}
for(int i=res1[x-1]+1;i<=n;++i){
if(!b[i]){
res1[x]=i;
++b[i];
for(int j=1;j<=n;++j)if(a[i][j])++b[j];
dfs(x+1);
for(int j=1;j<=n;++j)if(a[i][j])--b[j];
--b[i];
}
}
}
int main(){
freopen("race.in","r",stdin);
freopen("race.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=m;++i){
cin>>u>>v;
a[u][v]=a[v][u]=1;
}
dfs(1);
cout<<cnt<<endl;
for(int i=1;i<=n;++i){
if (res2[i]){
cout << i << " ";
}
}
return 0;
}
王老师的数学函数
文件 IO比赛题目
时间限制: 1000MS空间限制: 256MB
题目描述
王老师热爱数学,而这天石老师决定考考王老师
石老师设定了一个函数 fun(x),这个函数的意义是计算 x 的因数个数
例如 fun(12)=6,因为 12 有 6 个因数:1,2,3,4,6,12
而石老师提出的问题是,给出一个区间 [l,r] 他希望王老师计算 fun(l)+fun(l+1)+fun(l+2)⋯+fun(r) 的结果,即 ∑i=lrfun(i) 的和
由于数字范围不大,所以王老师轻松解决了这个问题
但是接着王老师就想到了一个问题,如果这道题的数字变大呢?
为了方便让所有数字变大,王老师想到的方案是——让所有数字变成 n 次幂!
也就是现在王老师会给出一个区间 [l,r] 和一个整数 n,他希望计算 fun(ln)+fun((l+1)n)+fun((l+2)n)⋯+fun(rn) 的结果,即 ∑i=lrfun(in) 的和
这个问题让王老师很满意,于是他决定用这个问题来考考你,由于结果可能很大,请你将结果对 1000000007 取模
输入格式
输入一行包含三个整数 l,r,n 含义如题
输出格式
输出一个整数表示答案,并将答案对 1000000007 取模
样例输入 1
1 12 2
样例输出 1
66
样例输入 2
1 100 2
样例输出 2
1194
提示/说明
数据范围
| 测试点编号 | r | n |
|---|---|---|
| 1∼3 | ≤100 | =1 |
| 4∼6 | ≤1000 | =1000 |
| 7∼10 | ≤1e12 | =10000000 |
对于所有数据满足 r−l≤1e6
代码
(没写出来放最后了)
逐花归海 花海
文件 IO比赛题目
时间限制: 3000MS空间限制: 512MB
题目描述
王老师来到了一片灿烂的花海,这片花海由山神打理,修理成了一个n×m的矩形
每朵花都有一个好看值,王老师喜欢好看的花。
王老师和山神达成了一笔交易,山神给了王老师一张神奇的网,这张网只能网住一个”口“形区域,并且王老师只能带走”口型“区域边缘的花。换言之,王老师需要选出一个区域(i1,j1),(i2,j2)(分别表示左上角和右下角),然后获得(i1,j1),(i1+1,j1),...(i2,j1),(i1,j2),(i1+1,j2),...(i2,j2)(i1,j1+1),(i1,j1+2),...,(i1,j2−1),(i2,j1+1),(i2,j1+2),...,(i1,j2−1)上的花,1≤i1<i2≤n,1≤j1<j2≤m。
王老师希望最后获得的花的好看值之和最大。
输入格式
第一行两个整数 n,m
接下来 n 行,每行 m 个数,表示花的美丽值 ai,j
输出格式
一个整数,表示获得的花的好看值之和的最大值
样例输入 1
5 4 3 -2 -2 -4 0 4 2 1 5 -1 0 -2 -6 -1 1 -1 1 3 -1 0
样例输出 1
10
样例输入 2
见下发大样例
样例输出 2
见下发大样例
样例输入 3
见下发大样例
样例输出 3
见下发大样例
提示/说明
样例解释:
选择子矩阵
0 4 2
5 -1 0
此时和最大为10
【子任务】
对于30%的数据,2≤n,m≤10
对于50%的数据,2≤n,m≤100。
对于100%的数据,2≤n,m≤105,n×m≤2×105,∣ai,j∣≤100
代码😁😁😁
#include <bits/stdc++.h>
using namespace std;
const int N = 450;
vector<int> row[N], col[N], a[N];
int f[200005], n, m;
int main() {
freopen("flower.in","r",stdin);
freopen("flower.out","w",stdout);
scanf("%d%d", &n, &m);
if (n < m) {
for (int i = 0; i <= n; ++i) {
a[i].resize(m + 1);
row[i].resize(m + 1);
col[i].resize(m + 1);
for (int j = 0; j <= m; ++j)
a[i][j] = row[i][j] = col[i][j] = 0;
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
scanf("%d", &a[i][j]);
} else {
for (int i = 0; i <= m; ++i) {
a[i].resize(n + 1);
row[i].resize(n + 1);
col[i].resize(n + 1);
for (int j = 0; j <= n; ++j)a[i][j] = row[i][j] = col[i][j] = 0;
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
scanf("%d", &a[j][i]);
swap(n, m);
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j) {
row[i][j] = row[i][j - 1] + a[i][j];
col[i][j] = col[i - 1][j] + a[i][j];
}
int ans = -1e9;
for (int l = 1; l <= n; ++l)
for (int r = l + 1; r <= n; ++r) {
f[m + 1] = -1e9;
for (int i = m; i >= 1; --i)
f[i] = max(f[i + 1], row[l][i - 1] + row[r][i - 1] + col[r][i] - col[l - 1]
[i]);
for (int i = 1; i < m; ++i)
ans = max(ans, -row[l][i] - row[r][i] + col[r][i] - col[l - 1][i] + f[i +
1]);
}
printf("%d\n", ans);
return 0;
}
猜你划到最后在找第4题代码
#include<cstdio>
typedef long long ll;
const int N=1000010,P=1000000007;
int i,j,k,p[N/10],tot,g[N],ans;
ll n,l,r,f[N];
bool v[N];
inline void work(ll p) {
for(ll i=l/p*p; i<=r; i+=p)if(i>=l) {
int o=0;
while(f[i-l]%p==0)f[i-l]/=p,o++;
g[i-l]=1LL*g[i-l]*(o*k+1)%P;
}
}
int main() {
freopen("function.in","r",stdin);
freopen("function.out","w",stdout);
for(i=2; i<N; i++) {
if(!v[i])p[tot++]=i;
for(j=0; j<tot&&i*p[j]<N; j++) {
v[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
scanf("%lld%lld%d",&l,&r,&k);
n=r-l;
for(i=0; i<=n; i++)f[i]=i+l,g[i]=1;
for(i=0; i<tot; i++) {
if(1LL*p[i]*p[i]>r)break;
work(p[i]);
}
for(ans=i=0; i<=n; i++) {
if(f[i]>1)g[i]=1LL*g[i]*(k+1)%P;
ans=(ans+g[i])%P;
}
printf("%d",ans);
return 0;
}
1665

被折叠的 条评论
为什么被折叠?



