安徽大学第九届大学生程序设计竞赛 网络预选赛
Total Submission: 250 Submission Accepted: 76
对于每组测试数据,第一行两个整数,n和m,(1<=n,m<=50)
接下来n行,每一行有m个数字(中间不分隔),表示这个学生每门课的成绩,其中成绩为1-9的整数。
Original | Transformed |
2 3 3 223 232 112 3 5 91728 11828 11111
Original | Transformed |
2 3
上代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
using namespace std;
int success[100];
struct stu{int num;int core;
};
bool cmp(stu a,stu b){return a.core >b.core;
}
int main(){int t,m,n,i,j;stu students[100];char a[100][100];cin>>t;while(t--){int ans=0;memset(success,0,sizeof(success));cin>>n>>m;for(i=0;i<n;i++){getchar();scanf("%s",a[i]);}for(i=0;i<m;i++){for(j=0;j<n;j++){students[j].core=(int)a[j][i]-'0';students[j].num=j;}sort(students,students+n,cmp);//排列 for(j=0;j<n;j++){success[students[j].num]=1;if(students[j+1].core!=students[j].core)break;}//并列的全都标记 } for(i=0;i<n;i++){if(success[i]==1)ans++;} cout<<ans<<endl;}}
PS(转):
题解
取出每个人每门课的成绩,排序后找出最大的几个,然后将他们的编号插入到 set 里
最后计算 set 的元素数量即可
#include <iostream>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
const int maxn = 55;
char score[maxn][maxn];
set<int> ans;
struct Node{int n;int w;Node(int a=-1,int b=-1):n(a),w(b){}bool operator < (const Node &rhs)const{return w > rhs.w;}
}node[maxn];
int main(){#ifdef debugfreopen("in.txt", "r", stdin);int START = clock();#endifcin.tie(0);cin.sync_with_stdio(false);int T;cin >> T;while(T--){ans.clear();int n,m;cin >> n >> m;for(int i=0;i<n;i++)cin >> score[i];for(int i=0;i<m;i++){for(int j=0;j<n;j++)node[j] = Node(j,score[j][i]);sort(node,node+n);int t = node[0].w;for(int j=0;j<n;j++){if(t == node[j].w)ans.insert(node[j].n);elsebreak;}}cout << ans.size() << endl;}#ifdef debugprintf("Time:%.3fs.\n", double(clock() - START) / CLOCKS_PER_SEC);#endifreturn 0;
}
Total Submission: 323 Submission Accepted: 74
如,9876经过一次变换成为9+8+7+6=30,经过第二次变换成为3+0=3,结束。
那么9876就经过了两次迭代变换。如今给一个正整数,问需要迭代变换多少次后会停止。
对于每组测试数据,只有一行,表示一个正整数,正整数最多有100000位。
Original | Transformed |
3 2 10 99999999
Original | Transformed |
0 1 2
上代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
using namespace std;
int main(){char a[100010];int t,n,flag,ans;long long int sum;cin>>t;while(t--){sum=0;ans=0;flag=0;scanf("%s",a);sum+=(int)a[0]-'0';for(int i=1;a[i]>='0' && a[i]<='9';i++){sum+=(int)a[i]-'0';if(flag==0){flag=1;ans++;}}while(sum>=10){cout<<ans<<" "<<sum<<endl;n=sum;sum=0;while(n>0){sum+=n%10;n/=10;}ans++;}cout<<ans<<" "<<sum<<endl;cout<<ans<<endl;}return 0;
}
PS(转):
#include <iostream>
#include <cstring>
using namespace std;const int maxn = 100005;
char s[100005];
int main(){#ifdef debugfreopen("in.txt", "r", stdin);int START = clock();#endifcin.tie(0);cin.sync_with_stdio(false);int T; scanf("%d",&T);while(T--){int ans = 0;scanf("%s",s);int size = strlen(s);int n = 0;bool flag = false;for(int i = 0;i < size;i++){n += s[i]-'0';if(flag)ans=1;if(!flag && s[i] - '0' > 0)flag = true;}while(n>=10){ans++;int t = 0;while(n){t += n%10;n /= 10;}n = t;}printf("%d\n",ans);}#ifdef debugprintf("Time:%.3fs.\n", double(clock() - START) / CLOCKS_PER_SEC);#endifreturn 0;
}
Total Submission: 452 Submission Accepted: 30
如1,2,3和3,1,2都是1-3的排列,但是1,3,3不是1-3的排列。
如今,给n个数,问最少修改几个数,可以使得序列成为1-n的一个排列。
对于每一组测试数据,第一行为一个整数n,(1 <= n <= 500)
第二行有n个整数a1,a2,……an,空格分隔,(ai为任意的32位有符号正整数)。
保证多组数据中的n的和不超过100000。
Original | Transformed |
2 5 1 3 2 4 5 6 1 1 1 1 1 1
Original | Transformed |
0 5
上代码:
/*怎么看都觉得坑,按下面解题者的意思来说就是,测试数据量和题目给的不一样,数组得开大一点,难怪我的总是runtime error,一个同学数组开到100000+10,通过了*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
using
namespace
std;
int
vis[510];//这里如果开到100000+10,应该就通过了
int
main(){
int
t,n,ans;
long
long
int
x;
cin>>t;
while
(t--){
ans=0;
memset
(vis,0,
sizeof
(vis));
cin>>n;
for
(
int
i=0;i<n;i++){
cin>>x;
if
(x<=n && x>0) //显然,题目如果给的n值超过500,runtime error就能解释了
vis[x]=1;
}
for
(
int
i=1;i<=n;i++){
if
(!vis[i])
ans++;
}
cout<<ans<<endl;
}
return
0;
}
ps(转):
题解
思路应该很容易,不过数据比较坑
用一个数组来记录 1-n
的数字哪个已经读入过了
没有读入的就是要交换的
这道题数据量和题目给的不一样
开大一点能解决
另外可以使用 set 来保存
只要是 1-n
的数字,直接扔到 set 里
最后 n-s.size()
即可
数字存在负数,因此读入的判断两侧都要判断
#include <cstdio>
#include <iostream>
#include <cstring>
#include <set>
using namespace std;
int main(){#ifdef debugfreopen("in.txt", "r", stdin);int START = clock();#endifcin.tie(0);cin.sync_with_stdio(false);int T;scanf("%d",&T);while(T--){set<int> s;s.clear();int n;scanf("%d",&n);for(int i=0;i<n;i++){int t;scanf("%d",&t);if(t <= n && t >= 1)s.insert(t);}printf("%d\n",n-s.size());} #ifdef debugprintf("Time:%.3fs.\n", double(clock() - START) / CLOCKS_PER_SEC);#endifreturn 0;
}
Total Submission: 286 Submission Accepted: 56
现在可以买的一共三种道具,分别是房子(每一个价值1234567个游戏币),车子(每一个价值123456个游戏币),电脑(每一个价值1234个游戏币)。
现在她想知道,通过买这三种道具是否可以把n个游戏币全部花光。
对于每一组测试数据,一个整数n(1<=n<=1000000000),代表现在的游戏币。
Original | Transformed |
2 1359257 17851817
Original | Transformed |
YES NO
上代码:
/*这题我没写出来,因为金额太大,本想用背包的,结果开不了那么大的数组~~~~~~,看看人家的吧*/
ps(转):
题解
由于最大的值非常大,如果直接 dfs 会非常慢
而且打表的文件会非常大
而看 1234567
和 1000000000
其实差别不是很大
除一下发现最多也就能买 800
多套房子
而即使全部买成汽车也就能买 8000
多辆
乘起来的数据量只有 10e6
完全是可以遍历的
也就是说,只需要枚举房子和车的数量,然后判断剩下的钱能不能整除电脑
这样做不超时的原因是房子和车的价格都非常大,可以将许多数据“跨越”掉
如果这数都很小的话,就没有办法了
#include<bits/stdc++.h>
using namespace std;
int main() {int T;cin >> T;while(T--) {int n;cin >> n;int flag = 0;
// int a = n/1234567;
// int b = n/123456;for(int i = 0 ; i <= n/1234567 ; i ++) {for(int j = 0 ; j <= n/123456 ; j ++) {if(n >= i*1234567 + j*123456){int cur = n - i*1234567 - j*123456;if(cur % 1234 == 0){flag = 1;
// goto tt;break;}}}if(flag)break;}
// tt:if(flag)cout << "YES" << endl;elsecout << "NO" << endl;}return 0;
}
Total Submission: 34 Submission Accepted: 2
为了最好地炫耀他的豪宅,西瓜准备从大门出发,经过一些楼房到达储藏室,再经过一些楼房回到自己的大门。
他要求他的路径越短越好,但是不能经过任意一条道路多于一次。请你计算这样的一条最短路径。西瓜保证这样的路径是存在的。
第2..M+1行:每行三个整数表示一条道路(起点,终点,长度)
Original | Transformed |
4 5 1 2 1 2 3 1 3 4 1 1 3 2 2 4 2
Original | Transformed |
6
上代码:
/*这题我还是没写出来,这次比较有水平的一题~~~~~~,看看人家的吧*/
PS(转):
题解
本次最难的一题
要求是对于一个无向图,在每条路只走一次的情况下,从起点到终点再返回起点的最短路
看到最短路,很容易就想到 BFS ,由于每条路有一定的权值,因此需要用 Dijkstra
很显然的思路,而且能通过样例
但是如果仔细分析样例就能发现有很大的问题存在
可以很容易看出来,去的时候最短路是 3
回来的时候最短路也是 3
但是,如果单纯只是删掉第一次最短路途径的边去跑第二次最短路,有可能就会出现问题
比如,如果第一次最短路走的是 1-2-3-4
这条路,那么第二次时压根就无法返回起点
也就是说,存在有多个最短路有重边的情况
这个问题导致了单纯的搜是不行的
图论问题,不会不如试下网络流
套用网络流的概念来分析下试试
- 最短路 = 最小费用
- 每个边一次 = 流量为1
看上去好像没有问题,再深入分析下
最小费用的是 最小费用最大流
它求的是在所有最大流中费用最小的
那么我们先要限定流量
由于每个边只能走一次,边的流量显然是 1
如何体现去回两次呢?
可以在建一个源点,这个源点往外的流量为 2 ,将它连在起点或终点上,然后跑它到另一个点的最小费用最大流
由于其他点的流量都是 1 ,这个节点往外的流量是 2 ,因此只要有解,最大流必然为 2
此时建的图已经和题意的图存在一些差别了
可以看作从起点走两条完全不同的路(每条路的流量为 1 )到终点(汇点流量为 2 )
建图完毕,套用模板
匡斌的模板里点的编号是 0~n-1
因此加边的时候要把 u 和 v 分别减去 1
初始化的时候记得加上汇点
输出最小的费用即可
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
const int MAXM = 10005;
const int INF = 0x3f3f3f3f;
struct Edge { int to,next,cap,flow,cost;
}edge[MAXM];
int head[MAXN],tol;
int pre[MAXN],dis[MAXN];
bool vis[MAXN];
int N;//节点总个数,节点编号从0~N-1
void init(int n){ N = n; tol = 0; memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int cap,int cost) { edge[tol].to = v; edge[tol].cap = cap; edge[tol].cost = cost; edge[tol].flow = 0; edge[tol].next = head[u]; head[u] = tol++; edge[tol].to = u; edge[tol].cap = 0; edge[tol].cost = -cost; edge[tol].flow = 0; edge[tol].next = head[v]; head[v] = tol++;
}
bool spfa(int s,int t) { queue<int>q; for(int i = 0;i < N;i++) { dis[i] = INF; vis[i] = false; pre[i] = -1; } dis[s] = 0; vis[s] = true; q.push(s); while(!q.empty()){ int u = q.front(); q.pop(); vis[u] = false; for(int i = head[u]; i != -1;i = edge[i].next){ int v = edge[i].to; if(edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost ){ dis[v] = dis[u] + edge[i].cost; pre[v] = i; if(!vis[v]){ vis[v] = true; q.push(v); } } } } if(pre[t] == -1)return false; else return true;
}
//返回的是最大流,cost存的是最小费用
int minCostMaxflow(int s,int t,int &cost) { int flow = 0; cost = 0; while(spfa(s,t)){ int Min = INF; for(int i = pre[t];i != -1;i = pre[edge[i^1].to]){ if(Min > edge[i].cap - edge[i].flow) Min = edge[i].cap - edge[i].flow; } for(int i = pre[t];i != -1;i = pre[edge[i^1].to]){ edge[i].flow += Min; edge[i^1].flow -= Min; cost += edge[i].cost * Min; } flow += Min; } return flow;
}
int main(){#ifdef debugfreopen("in.txt", "r", stdin);int START = clock();#endifcin.tie(0);cin.sync_with_stdio(false);int n, m;while(cin>>n>>m){init(n+1);for(int i=0;i<m;i++){int u,v,cost;cin >> u >> v >> cost;addedge(u-1,v-1,1,cost);addedge(v-1,u-1,1,cost);}addedge(n-1,n,2,0);int ans=0;minCostMaxflow(0,n,ans);cout << ans << endl;}#ifdef debugprintf("Time:%.3fs.\n", double(clock() - START) / CLOCKS_PER_SEC);#endifreturn 0;
}
Total Submission: 318 Submission Accepted: 116
现在你的任务是,确定火星上每年可能的最少放假的天数和最多放假的天数。
接下来n行,每行一个整数x (1<=x<=1,000,000),代表火星每年有x天。
Original | Transformed |
2 14 2
Original | Transformed |
4 4 0 2
上代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
using namespace std;
long long int n,Max,Min;
int main(){int t;cin>>t;while(t--){Max=0;Min=0;cin>>n;Max+=n/7*2;Min+=n/7*2;if(n%7==6){Max+=2;Min+=1;}else if(n%7>=2){Max+=2;}else if(n%7==1){Max+=1;}cout<<Min<<" "<<Max<<endl;}return 0;
}
Total Submission: 158 Submission Accepted: 31
你最多可以获得的馅饼数量是多少呢?
接下来n行,每行两个整数a和k(1<=a<=1,000,000,000; 0<=k<=100)。
Original | Transformed |
2 1990 1 1034 2
Original | Transformed |
9190 3104
上代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<vector>
using namespace std;
int main(){int t,i,j,k,p,max;string a;char temp;cin>>t;while(t--){cin>>a;getchar();cin>>k;for(i=0;i<a.length();i++){p=i;max=(int)a[i];for(j=i+1;j<a.length() && j-i<=k;j++){if((int)a[j]>max){p=j;max=(int)a[j];}}temp=a[p];for(j=p;j>i;j--){a[j]=a[j-1];}a[i]=temp;k=k-(p-i);}cout<<a<<endl;}
}
Total Submission: 478 Submission Accepted: 112
注意:1938年7月6日,小明0周岁,1938年7月7日小明1周岁,同理1939年7月6日,小明1周岁,1939年7月7日,小明2周岁。
对于每组测试数据,三个整数,逗号隔开,分别表示给定日期的年、月、日。给定的日期保证合法, 而且一定是小明出生后的日期,且小明的岁数保证在100以内。
Original | Transformed |
2 1938 7 6 1938 7 7
Original | Transformed |
0 1
上代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
using namespace std;
int a[3];
int main(){int t,ans;cin>>t;while(t--){cin>>a[0]>>a[1]>>a[2];ans=0;if(a[0]>=1937){ans+=a[0]-1938;if(a[1]>7 || (a[1]==7 && a[2]>=7))ans++;}cout<<ans<<endl;}return 0;
}
总结:这次网络赛做出来五题,C题如果题目数据给的没问题,应该能过六题的,剩下E题真不会,D题呢,哎,脑子转一转,其实数据给的意思可能就是让我暴力解决的。木啊!!!看别人代码也是一种是成长,尤其像我这种自己代码写得跟狗啃的一样,更应该多看看各路大神是怎么码代码的。
介绍一个不错的博客 :http://www.biyisi.cn/archives/date/2017/03
安徽大学第九届大学生程序设计竞赛 网络预选赛相关推荐
- 外卖的撕‘哔’大战 Contest2074 - 中南大学第九届大学生程序设计竞赛网络预选赛
先排序然后暴力 #include<iostream> #include<cstdio> #include<algorithm> using namespace st ...
- 挑战程序设计竞赛_我系首次参加第六届中国大学生程序设计竞赛网络预选赛
点击上方蓝字关注 「龙外信息工程系」 讲述有温度的故事 传递有态度的思想 2020年9月20日12时至17时,第六届中国大学生程序设计竞赛网络赛预选赛在杭州电子科技大学OJ成功举办,黑龙江外国 ...
- 【Java/补题/牛客/ACM赛制】2021年ICPC国际大学生程序设计竞赛暨陕西省第九届大学生程序设计竞赛(正式赛)
文章目录 题目链接 知识一览 题目列表 快输 C - GCD(数论分块) 题目链接 2021年ICPC国际大学生程序设计竞赛暨陕西省第九届大学生程序设计竞赛(正式赛) 知识一览 01-数论分块 题目列 ...
- “Wishare杯”南邮第九届大学生程序设计竞赛之网络赛 部分题解
作为一只退役狗,有幸还能出3个题(E,F,H) H.小学生都会 时间限制(普通/Java) : 10000 MS/ 30000 MS 运行内存限制 : 81920 KByte 总提 ...
- “亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 (K L题解)
"亚信科技杯"南邮第七届大学生程序设计竞赛之网络预赛 (K L题解) 第一次出题,果然背锅了,L题由于数据问题,让两种不对的方法ac了,分别是:H<0时取前一天送上花(应该是 ...
- “亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 (部分题解)
"亚信科技杯"南邮第七届大学生程序设计竞赛之网络预赛 比赛链接http://acm.njupt.edu.cn/acmhome/contest.do?&method=cont ...
- 2018中国大学生程序设计竞赛-网络选拔赛题解
以下所有AC题解程序来自"仙客传奇"团队. A. Buy and Resell AC的C++语言程序: #include<iostream> #include<c ...
- 2022.3.12 绍兴文理学院元培学院第十五届大学生程序设计竞赛
绍兴文理学院元培学院第十五届大学生程序设计竞赛 A 阳光明媚的数学题 B 爱的素数 C 庄生的笔 D 上流的聚餐 E 规划(一) F 规划(二) G 运动的球球 H 物资转移 I 小杨环 J 前四位 ...
- 中央民族大学计算机房,中央民族大学第九届大学生人文知识竞赛 暨北京市第九届大学生人文知识竞赛选拔赛通知...
北京市大学生人文知识竞赛是由北京市教委主办的学科竞赛,其目的是为吸引.鼓励广大学生增强学习人文知识(文.史.哲.艺以及必要的自然科学基础).阅读人文经典的兴趣与积极性,提高大学生的文化素养,促进文理交 ...
最新文章
- A站被黑,你应该做些什么?
- 好习惯!pandas 8 个常用的 index 设置
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 F- 1 + 2 = 3? (好难的找规律题)
- 重置oracle 11G的system、sys密码
- 测试化验加工费云服务器文献信息,监管▕ 科研经费使用中的 “红线”和“禁区”典型问题自查清单...
- H3C telnet 配置
- 【Quartz】解密properties配置文件中的账号密码
- 汉语字典_Android版最新官方版,汉语字典专业版2020
- 触动精灵将图片转成base64字符串后通过post方式上传给服务器
- 分享一个超酷创建互动文档的Javascript类库 - tangle
- <el-link>去掉下划线
- Oracle 12c CDB和PDB的切换
- lodop直接打印服务器的文件,C-Lodop云打印服务器
- 图像去雾开源数据集资源汇总
- 中国苹果之都苹果快成熟了
- 谈判如何在谈判中_工资谈判软件开发人员指南
- 虚幻4蓝图脚本中,函数,事件,宏的区别
- 使用vsftpd 搭建ftp 服务器
- 尚硅谷在线教育一:尚硅谷在线教育相关的基本搭建配置以及讲师管理模块
- m6000查看端口状态_M6000常用维护命令.doc
热门文章
- 浅谈MOS管的工作原理
- MAX31856 高精度热电偶至数字输出转换器开发笔记
- 游戏服务器停服维护公告,停服更新维护公告
- 【Android】【UI】ACTION_CANCEL什么时候执行
- IT十年人生过客-十六-再见雍和宫
- 芸芸众生中的一个过客
- 作为一名Sem优化师,平台怎么选?甲方or乙方?
- 学校计算机教室报损登记本,平阴县中小学功能室管理基本要求
- [转]在今天这个金钱的社会,如果肆意的由这样的人横行霸道; 何来的“百善孝为先”??!...
- 带有详细书签的IT电子书大全