編程1小時,提交4小時
做這種比賽一定要選一個好OJ啊
黑白圖像直方圖
發布時間: 2017年7月8日 21:00?? 最后更新: 2017年7月8日 22:38?? 時間限制: 1000ms?? 內存限制: 128M
?
?
在一個矩形的灰度圖像上,每個像素點或者是黑色的或者是白色的。黑色像素點用1 表示,白色像素點用0 表示。現在要求你編寫一個程序,計算每列上黑色像素點的個數并輸出。如下圖所示是一個6?8 的黑板圖像。?
1 1 0 0 1 1 1 1
0 1 1 0 1 0 1 0
1 1 1 1 0 1 1 0
0 1 1 0 0 1 0 0
1 0 1 0 0 1 0 0
0 1 0 1 0 1 1 0
?
輸入有多組組。
每組的第一行有2 個整數m 、n ,(1<=m ,n<=100 )。
接著有m 行,每行有n 個數字,每個數字是0 或1 ,之間用一個空格分開。
對圖像數據,依次一行輸出圖像中每列黑色像素點的總數。
3 5 1 1 0 0 1 0 1 1 0 1 1 1 1 1 0 6 8 1 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0
2 3 2 1 2 3 5 4 2 2 5 4 1
#include <bits/stdc++.h> using namespace std; int a[105]; int main() {ios::sync_with_stdio(false);cin.tie(0);int n,m;while(cin>>n>>m){for(int i=0;i<m;i++)a[i]=0;for(int i=0;i<n;i++)for(int j=0;j<m;j++){int p;cin>>p;a[j]+=p;}cout<<a[0];for(int i=1;i<m;i++){cout<<" "<<a[i];}cout<<endl;}return 0; }
神無月排位賽
發布時間: 2017年7月8日 21:06?? 最后更新: 2017年7月8日 22:35?? 時間限制: 1000ms?? 內存限制: 128M
《神無月》作為盛大游戲2017年的全新原創大作,其開發團隊在自研實力強大的傳世工作室基礎之上,還有美樹本晴彥等日本一線知名畫師及日本游戲音樂大師崎元仁加盟參與制作。目前正在不限號內測中,有很多玩家進入到神無月的世界中。
在神無月中,有著玩家之間切磋的排位賽,其段位主要分為五大段位,從低到高依次為:新兵、菁英、戰將、統帥、王者。每個玩家只有從新兵段位慢慢努力,一點點晉級才能到達王者段位。成為一個王者是每一個玩家的追求和心愿。
假設神無月的段位系統如下:
從低到高的段位依次簡記為:D、C、B、A、S。玩家打排位賽,每勝利1局增加10分,輸1局扣除5分。每一個段位都需要積分,累計100分才可以進入晉級賽,晉級賽采用三局兩勝制(3局中達到2局勝利就晉級成功,有2局失敗就算晉級失敗, 連勝或連敗兩局,第三局不需要打了)。晉級成功后,成為下一個段位,積分變為0,重新開始算分;如果晉級失敗,則積分變為60,重新開始算分。為方便計算,如果該玩家一直輸,積分降為0后,不再降分,也不會掉段位。
大圣同學最近對神無月非常喜歡,一直在努力成為王者。他從新兵0分開始打排位賽(剛開始處在段位D),他告訴你最近若干場比賽的最后勝利情況,請你寫個算法猜猜他現在所處的段位。當段位到達S時,段位將不再提高。
有若干組數據。
每組的第一行為一個N (0<N<500 ),表示有N 場比賽數據。
第二行有N 個數字,每個數字之間有空格隔開,每個數字代表每場比賽的輸贏情況,1 表示贏,0 表示輸。
注意:當第n 場比賽結束時,若大圣同學正處于晉級賽,并且還無法決定晉級成功或失敗,那么可以忽略這場晉級賽
對于每組比賽數據,輸出最后所處的段位的一個英文字符(D 、C 、B 、A 、S 這五個段位中的一個)。
15 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 30 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1
C B
#include <bits/stdc++.h> using namespace std; int main() {ios::sync_with_stdio(false);cin.tie(0);int t;while(cin>>t){int n=0,f=0,f1=0,f2=0,f3=0;for(int i=0; i<t; i++){int p;cin>>p;if(!f){if(p)n+=10;else if(n>=5)n-=5;if(n>=100)f=1;}else{if(p)f1+=1;else f2+=1;if(f2==2){f=0;n=60;f1=0;f2=0;}else if(f1==2){f=0;n=0;f3++;f1=0;f2=0;}}}if(f3>3)printf("S\n");else if(f3>2)printf("A\n");else if(f3>1)printf("B\n");else if(f3>0)printf("C\n");elseprintf("D\n");}return 0; }
I Love ces
發布時間: 2017年7月8日 21:08?? 最后更新: 2017年7月8日 22:33?? 時間限制: 1000ms?? 內存限制: 128M
時間過得好快啊,SHU計算機學院又有新的一批小朋友們進來了。2016級的同學想必也是非常喜歡計算機學院的,于是院長想測試一下大家對計算機的喜愛程度(院長大人別查我水表)。
院長給大家一行由大寫字母(A-Z)和小寫字母(a-z)組成的字符串,允許同學們在這個字符串里面任意挑選若干個字符,問最多可以組成多少個I LOVE CES(不區分大小寫,沒有空格,即只要有這8個字符就可以組成一個)。
多組輸入,每組一行,輸入一個字符串。
字符串長度<=100000 。
每組輸出一行答案,如題意。
IlovecesiLOVECES
2
#include <bits/stdc++.h> using namespace std; char s[100005]; int main() {while(~scanf("%s",s)){int I=0,l=0,o=0,v=0,c=0,e=0,st=0;for(int i=0;s[i];i++)if(s[i]=='i'||s[i]=='I')I++;else if(s[i]=='l'||s[i]=='L')l++;else if(s[i]=='o'||s[i]=='O')o++;else if(s[i]=='v'||s[i]=='V')v++;else if(s[i]=='e'||s[i]=='E')e++;else if(s[i]=='c'||s[i]=='C')c++;else if(s[i]=='s'||s[i]=='S')st++;e/=2;printf("%d\n",min(min(min(I,l),min(o,v)),min(min(c,e),st)));}return 0; }
添加好友
發布時間: 2017年7月8日 21:10?? 最后更新: 2017年7月8日 22:32?? 時間限制: 1000ms?? 內存限制: 128M
Tony最近喜歡上了龍之谷游戲,所以他想叫上他的好友組建一個公會來一起享受這款游戲。
Tony一共有n 個好友,他可以叫上任意k (1<=k<=n )個好友來組建公會,并且所有好友都會答應他的請求。問Tony一共可以有多少種方案組建這個公會?
只要不是完全相同的人組建的方案視為不同方案,并且Tony至少要叫上一個人。
多組輸入,每組一行,輸入一個正整數n (1<=n<=1000000000 )。
每組輸出一行,輸出方案數。(對1000000007 取膜)
2
3
#include <stdio.h> #include <bits/stdc++.h> typedef long long LL; const LL c=1e9+7; using namespace std; LL la(LL a, LL b) {LL ans=1;a%=c;while(b>0){if(b%2==1)ans=(ans*a)%c;b=b/2;a=(a*a)%c;}return ans; } int main() {LL n;while(cin>>n){printf("%lld\n",(la(2,n)-1+c)%c);}return 0; }
字符串進制轉換
發布時間: 2017年7月8日 21:13?? 最后更新: 2017年7月8日 22:31?? 時間限制: 1000ms?? 內存限制: 128M
Claire Redfield在龍之谷游戲的一次任務中獲得了一個上了鎖的寶箱,上面刻了一串由小寫字母構成的字符串A和一個數字m 。
經過Claire長時間研究,他發現密碼是和a ,m 有關的。字符串A相當于一個26進制的數字,a 相當于0 ,b 相當于1 …….z 相當于25 。然后要將這個26進制的數轉化成m 進制那就是這個寶箱的密碼。
Claire覺得這個太簡單了所以要你幫她完成。
多組輸入,每組一行,輸入一個字符串A 和一個正整數m 。
字符串長度<=10,2<=m<=9 。
每組輸出一行答案,如題意。
b 2
1
#include <bits/stdc++.h> using namespace std; typedef long long LL; char f[100]; int l; void la(LL n, int b) {static char c[16]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};l=0;while(n) {f[l++]=c[n%b];n=n/b;} } int main() {ios::sync_with_stdio(false);cin.tie(0);string s;int m;while(cin>>s>>m){LL t=0;for(int i=0;s[i];i++)t=t*26+s[i]-'a';if(t==0){printf("%d",0);}else{la(t,m);for(int k=l-1; k>=0; k--)printf("%c",f[k]);}puts(""); }return 0; }
A序列
發布時間: 2017年7月8日 21:16?? 最后更新: 2017年7月8日 22:29?? 時間限制: 1000ms?? 內存限制: 128M
如果一個序列有奇數個正整數組成,不妨令此序列為a1,a2,a3,...,a2?k+1 (0<=k ),并且a1,a2...ak+1 是一個嚴格遞增的序列,ak+1,ak+2,...,a2?k+1 ,是一個嚴格遞減的序列,則稱此序列是A序列。
比如1 2 5 4 3就是一個A序列。
現在Jazz有一個長度為n 的數組,他希望讓你求出這個數組所有滿足A序列定義的子序列里面最大的那個長度。(子序列可以不連續)
比如1 2 5 4 3 6 7 8 9,最長的A序列子串是1 2 5 4 3。
多組輸入,每組兩行。
第一行是n ,表示給的數組的長度。
第二行有n 個數(int范圍),即給你的數組。
1<=n<=500000 。
每組輸入輸出一行,即最長的A序列子串的長度。
9 1 2 5 4 3 6 7 8 9
5
#include<stdio.h> #include<bits/stdc++.h> using namespace std; const int N=5e5+10; int a[N],f[N],l[N],r[N]; int main() {int n;while(~scanf("%d",&n)){for(int i=1; i<=n; i++)scanf("%d",&a[i]);int c=1;l[1]=1,r[n]=1,f[1]=a[1];for(int i=2; i<=n; i++){if(a[i]>f[c]) {f[++c]=a[i];l[i]=c;}else{int k=lower_bound(f+1,f+c,a[i])-f;l[i]=k;f[k]=a[i];}}c=1,f[1]=a[n];for(int i=n-1; i ; i--){if(a[i]>f[c]) {f[++c]=a[i];r[i]=c;}else{int k=lower_bound(f+1,f+c,a[i])-f;r[i]=k;f[k]=a[i];}}c=0;for(int i=1; i<=n; i++)c=max(c,min(2*l[i]-1,2*r[i]-1));printf("%d\n",c);}return 0; }
?巧用c++的stl簡單實現最長上升子序列
fill(g,g+n,infinity); for(int i=0;i<n;i++) {int j=lower_bound(g, g+n,a[i])-g;f[i]=j+1;g[j]=a[i]; }
丟史蒂芬妮
發布時間: 2017年7月9日 18:17?? 最后更新: 2017年7月9日 21:05?? 時間限制: 1000ms?? 內存限制: 128M
有一天,空和白很無聊,決定玩盛大游戲,考慮到兩個人玩,他們隨便掏了一個游戲出來:在一個n?m的棋盤上,首先把史蒂芬妮·多拉放在左上角(1,1)的位置。每次一個人可以將她往下,往右,往右下丟一格。當前回合,誰不能丟史蒂芬妮,誰就輸了。(注意,不可以把活人丟出棋盤啦!)游戲總是空先手。
白說,這是一個垃圾游戲!我們每次把史蒂芬妮丟素數個位置吧!(換句話說,每次丟2或3或5或7或…格)空答應了。
我們都知道,空和白都很聰明,不管哪方存在一個可以必勝的最優策略,都會按照最優策略保證勝利。
玩了一局,空已經知道了這個游戲的套路,現在他決定考考你,對于給定的n和m,空是贏是輸?如果空必勝,輸出“Sora”(無引號);反之,輸出“Shiro”(無引號)。
第一行有一個T表示數組組數,1<=T<100000
從第二行開始,每行為棋盤大小,n、m分別表示行列。
1=<n<=500,1=<m<=500
對于每組數據,按題目要求輸出。
4 1 1 2 2 10 10 30 30
樣例輸出1
Shiro Shiro Shiro Sora
這個就是個sg函數唄,比如我2就是個必勝啊
然后設個三重循環考慮終點
這位聚聚的預處理
也可以進這位聚聚的博客看其他代碼哦
#include <bits/stdc++.h> using namespace std; #define mst(a,b) memset((a),(b),sizeof(a)) const int maxn= 500; const ll mod = 1e9+7; const int INF = 0x3f3f3f3f; const double eps = 1e-6; int prime[maxn+5]= {0}; int num_prime=0; bool isprime[maxn+5]= {1,1}; int vis[maxn+5][maxn+5]; void init() {for(int i=2; i<maxn+5; i++){if(!isprime[i])prime[num_prime++]=i;for(int j=0; j<num_prime&&i*prime[j]<maxn+5; j++){isprime[i*prime[j]]=1;if(i%prime[j]==0)break;}}mst(vis,0); //1:必勝 2:必敗vis[1][1]=2;for(int i=1; i<=maxn; i++){for(int j=1; j<=maxn; j++){if(vis[i][j]==0){vis[i][j]=2;}if(vis[i][j]==2){for(int k=0; ; k++){if(i+prime[k]>maxn&&j+prime[k]>maxn)break;if(i+prime[k]<=maxn){vis[i+prime[k]][j]=1;}if(j+prime[k]<=maxn){vis[i][j+prime[k]]=1;}if(i+prime[k]<=maxn&&j+prime[k]<=maxn){vis[i+prime[k]][j+prime[k]]=1;}}}}} } int main() {init();int n,m;int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);if(vis[n][m]==1) puts("Sora");else puts("Shiro");}return 0; }
另一位聚聚的記憶化搜索
#include<bits/stdc++.h> using namespace std; int n,m,k,t,qu[maxn]; bool dp[maxn][maxn],vis[maxn][maxn]; bool dfs(int x,int y) {if(vis[x][y])return dp[x][y];vis[x][y]=true;for(int i=1;i<=qu[0];i++){if(x-qu[i]>0)dp[x][y]|=(!dfs(x-qu[i],y));if(y-qu[i]>0)dp[x][y]|=(!dfs(x,y-qu[i]));if(x-qu[i]>0&&y-qu[i]>0)dp[x][y]|=(!dfs(x-qu[i],y-qu[i]));}return dp[x][y]; } bool sushu(int x) {if(x==2)return true;else if(x%2==0)return false;for(int i=3;i*i<=x;i+=2)if(x%i==0)return false;return true; } void init() {int i,j;rep(i,2,maxn-10)if(sushu(i))qu[++qu[0]]=i;rep(i,1,maxn-10)rep(j,1,maxn-10)dfs(i,j); } int main() {int i,j;init();scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);puts(dp[n][m]?"Sora":"Shiro");}return 0; }
?
?