2017-AHU校赛网络赛解题报告
E題的網絡流還不會,先放著。由于打網絡賽的時候在南京玩,隨便找了家網吧做了前面幾題,后面的幾題由于比賽結束還沒有放到OJ上評測,但都和AC的代碼對拍100項以上沒問題的,不出意外都能A。(這是個flag···)
A.成功人士
題面:
Description 
 學校里共有n個學生,m門課,如果某個學生在某門課中拿到了最高分(可以是并列),則這個學生是成功人士。現在給出n個學生的m門課的成績,問有多少個成功人士。
Input 
 第一行,一個整數t,表示測試數據組數,(1<=t<=100) 
 對于每組測試數據,第一行兩個整數,n和m,(1<=n,m<=50) 
 接下來n行,每一行有m個數字(中間不分隔),表示這個學生每門課的成績,其中成績為1-9的整數。
Output 
 每組測試數據,一個整數,表示有多少個成功人士。
Sample Input 
 2 
 3 3 
 223 
 232 
 112 
 3 5 
 91728 
 11828 
 11111
Sample Output 
 2 
 3
思路:
在第一次循環讀入成績的時候,得出每一門的最高成績并記錄。之后再掃一遍數人數就行了。
代碼:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef struct {char grade[60];//由于題面上各個成績之間沒有空格,所以干脆用字符串進行處理 } Stu; int main() {int m,n,t;Stu student[60];cin>>t;while(t--){char maxn[60];memset(maxn,'0',sizeof(maxn));memset(student,0,sizeof(student));cin>>n>>m;for(int i=0;i<n;++i){for(int j=0;j<m;++j){cin>>student[i].grade[j];if(student[i].grade[j]>maxn[j])maxn[j]=student[i].grade[j];}}int ans=0;for(int i=0;i<n;++i){for(int j=0;j<m;++j){if(student[i].grade[j]==maxn[j]){ans++;//找到一個記錄后記得跳出這一層循環,因為不管一個人的成績有多少門第一,都只能算一次。break;}}}cout<<ans<<endl;}return 0; }B.迭代歸一
題面:
Description 
 我們把一個正整數的每一位上的數字加起來,得到新的數字,我們把這樣的一次操作稱為一次迭代變換。直到這個數字只有一位數。 
 如,9876經過一次變換成為9+8+7+6=30,經過第二次變換成為3+0=3,結束。 
 那么9876就經過了兩次迭代變換。如今給一個正整數,問需要迭代變換多少次后會停止。
Input 
 一個整數t,表示測試數據組數(1<=t<=100)。 
 對于每組測試數據,只有一行,表示一個正整數,正整數最多有100000位。
Output 
 輸出若干行,每行對應每組數據需要迭代變換的次數
Sample Input 
 3 
 2 
 10 
 99999999
Sample Output 
 0 
 1 
 2
思路:
由于正整數比較大,所以用數組進行保存。但處理過一次就不需要了,拿int存就夠了。 
 純模擬題,按題意敲就行了。
代碼:
#include<iostream> #include<cstring> #include<cstdlib> using namespace std; int main() {int t;cin>>t;while(t--){char number[100000];memset(number,0,sizeof(number));cin>>number;long long a=0,b=0;//比賽的時候以防萬一用的是long long,但其實int應該也夠了int len=strlen(number);if(len==1){cout<<"0"<<endl;continue;}int ans=1;for(int i=0;i<len;++i)b+=number[i]-'0';//轉化為數字while(b>=10){int a=0;while(b>0){a+=b%10;b/=10;}b = a;ans++;}cout<<ans<<endl;}return 0; }C.置換的魔術
題面:
Description 
 有n個正整數,其中1到n的正整數出現且只出現一次的序列,稱為1-n的一個排列。 
 如1,2,3和3,1,2都是1-3的排列,但是1,3,3不是1-3的排列。 
 如今,給n個數,問最少修改幾個數,可以使得序列成為1-n的一個排列。
Input 
 一個整數t,表示測試數據的組數,(1<=t<=210) 
 對于每一組測試數據,第一行為一個整數n,(1 <= n <= 500) 
 第二行有n個整數a1,a2,……an,空格分隔,(ai為任意的32位有符號正整數)。 
 保證多組數據中的n的和不超過100000。
Output 
 每組測試數據,輸出一個整數,表示最少修改幾個數。
Sample Input 
 2 
 5 
 1 3 2 4 5 
 6 
 1 1 1 1 1 1
Sample Output 
 0 
 5
思路:
給的數有可能是負數或者是大于n的數,要小心。 
 用一個bool數組標記一下,最后掃一遍計數應該就可以了。
代碼:
#include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> using namespace std; int main() {int T;cin>>T;while(T--){int n;int a[510];bool flag[510];memset(flag,true,sizeof(flag));cin>>n;for(int i=0;i<n;++i){cin>>a[i];if(a[i]>0&&a[i]<=n)//控制數據范圍flag[a[i]]=false;}int cnt=0;for(int i=1;i<=n;++i){if(!flag[i])cnt++;}cout<<cnt<<endl;}return 0; }D.買買買
題面:
Description 
 一天Alice打開了她日常玩的游戲,發現她里面還有n個游戲幣,她想把這些游戲幣花光。 
 現在可以買的一共三種道具,分別是房子(每一個價值1234567個游戲幣),車子(每一個價值123456個游戲幣),電腦(每一個價值1234個游戲幣)。 
 現在她想知道,通過買這三種道具是否可以把n個游戲幣全部花光。
Input 
 第一行,一個數字t(1<=t<=100)。代表測試數據數量。 
 對于每一組測試數據,一個整數n(1<=n<=1000000000),代表現在的游戲幣。
Output 
 輸出n行,每行輸出”YES”或者”NO”,表示她可以或者不可以把游戲幣全部花光。
Sample Input 
 2 
 1359257 
 17851817
Sample Output 
 YES 
 NO
思路:
由于車,房子的價值都很大,所以能用枚舉逐個嘗試。然后把剩下的錢看對于電腦的錢取%,看是否為零就行了。
代碼:
#include<iostream> #include<cstdlib> #define HOUSE 1234567 #define CAR 123456 #define COM 1234 using namespace std; int main() {cin.sync_with_stdio(false);int T;cin>>T;while(T--){bool flag=false;long long n;cin>>n;int mh=n/HOUSE;for(int i=0;i<=mh;++i){int mcar=(n-i*HOUSE)/CAR;for(int j=0;j<=mcar;++j)if((n-i*HOUSE-j*CAR)%COM==0){flag=true;}if(flag)break;}if(flag)cout<<"YES\n";elsecout<<"NO\n";}return 0; }F.周末大法好
題面:
Description 
 在火星上,每年有x天。驚奇的是,和地球上一樣,火星上也是有星期的概念的,連續的5天工作日,然后連續的2天周末。他們只有周末放假。 
 現在你的任務是,確定火星上每年可能的最少放假的天數和最多放假的天數。
Input 
 第一行,一個數字n。代表測試數據數量。 
 接下來n行,每行一個整數x (1<=x<=1,000,000),代表火星每年有x天。
Output 
 輸出n行,每行兩個整數。代表火星上每年可能的最少放假的天數和最多放假的天數。
Sample Input 
 2 
 14 
 2
Sample Output 
 4 4 
 0 2
思路:
先把一年天數除以7乘以2,這是最少的放假天數。 
 然后一年天數對7取%,剩下的如果是6,則最少天數還要再加一。 
 而最多的天數應該是至少的放假天數加上min(一年天數%7,2),因為如果只剩下一天了,最多只能放假一天。而其他情況則可以是在一年開頭多過一個周末(也就是兩天)
代碼:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() {int t;cin>>t;while(t--){int x;cin>>x;int Min=x/7*2,Max;int mod=x%7;if(mod==6)Min++;Max=x/7*2+min(mod,2);cout<<Min<<" "<<Max<<endl;}return 0; }G. 交換大法好
題面:
Description 
 有一天,天上掉餡餅了。不過不是直接掉餡餅,是告訴你你將要得到的餡餅的數量a。聰明的你得到了一種魔法,可以在整數a中交換任意兩個相鄰的數字。而這種魔法,你最多只能使用k次。你使用魔法操作a,得到的最大的結果就是你最終獲得的餡餅數量。
你最多可以獲得的餡餅數量是多少呢?
Input 
 第一行,一個數字n(1<=n<=60)。代表測試數據數量。 
 接下來n行,每行兩個整數a和k(1<=a<=1,000,000,000; 0<=k<=100)。
Output 
 輸出n行,每行一個整數,代表你最多使用魔法k次,可以得到的最大的數字。
Sample Input 
 2 
 1990 1 
 1034 2
Sample Output 
 9190 
 3104
思路:
暴力找
代碼:
#include<iostream> #include<cstring> #include<cstdlib> using namespace std; void swap(char *a,char *b) {char t=*a;*a=*b;*b=t; } int main() {int T;cin>>T;while(T--){char s[20];int k;cin>>s>>k;int len=strlen(s);if(len==1){cout<<s<<endl;continue;}char Max='0';int Maxid=-1;for(int i=0;i<len;++i){if(k<=0)break;Max = s[i]; Maxid = i;for(int j=i;j<=i+k&&j<len;++j){if(s[j]>Max){Max=s[j];Maxid=j;}}k-=Maxid-i;for(int x=Maxid;x>i;--x)swap(&s[x],&s[x-1]);}cout<<s<<endl;}return 0; }H. 今年多少歲
題面:
Description 
 小明出生于1937年7月7日,問對于給定的日期,小明幾周歲了,不足一周年的部分可以忽略。 
 注意:1938年7月6日,小明0周歲,1938年7月7日小明1周歲,同理1939年7月6日,小明1周歲,1939年7月7日,小明2周歲。
Input 
 一個整數t(1<=t<=100),表示數據組數 
 對于每組測試數據,三個整數,逗號隔開,分別表示給定日期的年、月、日。給定的日期保證合法, 而且一定是小明出生后的日期,且小明的歲數保證在100以內。
Output 
 對于每一組數據,輸出一個整數,表示小明的周歲數。
Sample Input 
 2 
 1938 7 6 
 1938 7 7
Sample Output 
 0 
 1
思路:
先年份相減,然后看月份和日期,若不夠一年,則結果減一。真·簽到題,沒啥說的。
代碼:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() {const int year=1937,month=7,day=7;int T;cin>>T;while(T--){int y,m,d;cin>>y>>m>>d;int ans=0;ans=y-year;if(m<month)ans--;if(m==month&&day>d)//如果不夠一年的情況ans--;cout<<ans<<endl;}return 0; }總結
以上是生活随笔為你收集整理的2017-AHU校赛网络赛解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Java 跨平台获取 MAC 地址的两种
- 下一篇: 看雪论坛追加加密解密
