2015 湘潭大學程式設計比賽(Internet) 全解析 + AC程式碼
阿新 • • 發佈:2019-02-16
一到搜尋卡死人...
1. 兩個變數記錄等級和經驗值就好.
int main(){ int T; scanf("%d",&T); while(T--){ int n,l; int jy=0; int sum = 0; scanf("%d%d",&n,&l); for(int i = 0;i<n;i++){ int t; scanf("%d",&t); if(l<t) continue; jy += 10/(l-t+1); sum += 10/(l-t+1); if(jy>=100) l++,jy -= 100; } printf("%d %d\n",l,sum); } return 0; }
2. 數字對應相加,注意進位處理和最後全部處理完成後跳出迴圈的進位
3. 第n個數字是多少,這個要注意char str[100]; int main(){ int T; scanf("%d",&T); while(T--){ int n,num[10]; scanf("%d",&n); int len = 0; int m = n; while(n) num[len++] = n%10,n/=10; if(len==1 || m==0){ printf("%d\n",m); continue; } int add = 0; int length = 0; if(len&1){ str[length++]=num[len/2]+'0'; } for(int i = len/2-1;i>=0;i--){ int t = num[i] + num[len-i-1] + add; str[length++] = t%10 + '0'; add = t/10; } if(add) str[length++] = add + '0'; for(int i = length-1;i>=0;i--) printf("%c",str[i]); printf("\n"); } return 0; }
(1) 個位單獨處理.
(2),就是整除情況. 這個在數字規律中經常容易犯錯
(3) 用遞推要開long long
int main(){ int T; scanf("%d",&T); long long mm[20]; long long num[20]; num[1] = 9; mm[1]=1; mm[0]=num[0]=0; for(long long i = 2,t=9;i<20;i++){ t = t*10; num[i] = i*t + num[i-1]; mm[i] = mm[i-1]*10; } mm[1]=0; while(T--){ int n; scanf("%d",&n); if(n<10) { printf("%d\n",n); continue; } int loc = 1; for(int i = 1;i<20;i++) if(num[i]>=n) {loc = i; n -= num[loc-1];break;} //else if(num[i]==n){loc = i; n -= num[loc];break;} int tag = 0; if(n%loc==0) tag=-1; long long ans = mm[loc] + n/loc +tag; for(int i = 0;i<loc;i++){ if((loc-i)%loc==n%loc){ printf("%d\n",ans%10); break; }ans/=10; } } return 0; }
4. 直接貪心,從當前位置向後min(m,len(str)) 找到最小的換過來. 題意是要求輸出前導0的,因為這個wa了很久
int main(){
int T;
scanf("%d",&T);
while(T--){
int m;
getchar();
scanf("%s%d",s,&m);
memset(ans,0,sizeof(ans));
int len = strlen(s);
for(int i = 0;i<len;i++){
int k = 0;
int n = 0;
int b = 0;
for(;k<len;k++) if(s[k]!=-1) break;
for(int j = k;n<=m && j<len ;n++,j++){
if(s[j]==-1) {n--;continue;}
if(i==0 && s[j]=='0') continue;
if(s[k] > s[j]) k = j,b=n;
}
ans[i] = s[k];
s[k] = -1;
m -= b;
}
printf("%s\n",ans);
}
return 0;
}
5. 矩陣累計和......
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int s[1005][1005],l[1005][1005],h[1005][1005];
int T,n,m,q;
int main(){
#ifndef ONLINE_JUDGE
//freopen("in.txt","r",stdin);
#endif
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&q);
memset(s,0,sizeof(s));
memset(l,0,sizeof(l));
memset(h,0,sizeof(h));
int tmp;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&tmp);
l[i][j]=l[i][j-1]^tmp;
h[i][j]=h[i-1][j]^tmp;
s[i][j]=s[i-1][j-1]^tmp^l[i][j-1]^h[i-1][j];
}
}
for(int i=1;i<=m;i++){
//printf("%d %d\n",s[1][i],l[1][i]);
}
int x1,y1,x2,y2;
while(q--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int sum=0;
sum^=s[x1-1][y1-1];
sum^=s[x1-1][m]^s[x1-1][y2];
sum^=s[x2][y2]^s[x1-1][y1-1]^(s[x1-1][y2]^s[x1-1][y1-1])^(s[x2][y1-1]^s[x1-1][y1-1]);
sum^=s[n][y1-1]^s[x2][y1-1];
sum^=s[n][m]^s[x2][y2]^(s[x2][m]^s[x2][y2])^(s[n][y2]^s[x2][y2]);
printf("%d\n",sum);
}
}
}
6. 這個搜尋不知道哪裡有問題....用優先佇列和vis[x][y][l]判重.可以迴圈走,取模即可
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1100;
const int INF=0x3f3f3f3f;
int N,K,L;
//int fx[4][2]={-1,0, 0,1, 1,0, 0,-1};
int fx[4][2] ={0,1,0,-1,1,0,-1,0};
int vis[55][55][110];
int jump[55][55][2];
char mp[55][55];
struct P{
P(){}
P(int x,int y ,int l,int s):x(x),y(y),l(l),s(s){}
int x,y,l,s;
friend bool operator < (const P& a,const P&b) {
if(a.s==b.s)
return a.l<b.l;
return a.s>b.s;
}
}st,ed;
int solve(){
priority_queue<P> q;
q.push(st);
vis[st.x][st.y][st.l] = 1;
while(q.size()){
P now = q.top();q.pop();
if(mp[now.x][now.y] =='$') return now.s;
int jx = jump[now.x][now.y][0];
int jy = jump[now.x][now.y][1];
if(jx!=-1 && jy!=-1 && mp[jx][jy] != '#' && now.l>0 && vis[jx][jy][now.l-1]==0){
vis[jx][jy][now.l-1]=1;
q.push(P(jx,jy,now.l-1,now.s));
}
for(int i = 0;i<4;i++){
jx = (now.x + fx[i][0]+N)%N;
jy = (now.y + fx[i][1]+N)%N;
if(mp[jx][jy]=='#' || vis[jx][jy][now.l]) continue;
vis[jx][jy][now.l]=1;
q.push(P(jx,jy,now.l,now.s+1));
}
}
return INF;
}
int main(){
freopen("test.txt","r",stdin);
freopen("out1.txt","w",stdout);
int cas = 0;
while(~scanf("%d%d%d",&N,&K,&L)){
if(cas++ == 445)
cas --;
memset(jump,-1,sizeof(jump));
memset(vis,0,sizeof(vis));
for(int i = 0;i<K;i++){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
a--,b--,c--,d--;
jump[a][b][0]=c;
jump[a][b][1]=d;
}
getchar();
for(int i = 0;i<N;i++){
gets(mp[i]);
for(int j = 0;j<N;j++){
if(mp[i][j]=='@') st.x = i,st.y = j,st.s = 0,st.l = L;
if(mp[i][j]=='$') ed.x = i,ed.y = j;
}
}
int ans = solve();
if(ans!=INF) printf("%d\n",ans);
else printf("Poor man!\n");
}
return 0;
}
7. 直接遞推就搞定,注意取模
using namespace std;
const int maxn=1100;
const int INF=0x3f3f3f3f;
int N,K,L;
int values[510][510];
int path[510][510];
int mp[510][510];
int main(){
while(~scanf("%d",&N)){
for(int i = 0;i<N;i++)
for(int j = 0;j<N;j++)
scanf("%d",mp[i]+j);
path[0][0]=1;
values[0][0] = mp[0][0];
for(int i = 1;i<N;i++)
values[0][i] = values[0][i-1] + mp[0][i],
path[0][i] = 1;
for(int i = 1;i<N;i++)
values[i][0] = values[i-1][0] + mp[i][0],
path[i][0] = 1;
for(int i = 1;i<N;i++)
for(int j = 1;j<N;j++){
if(values[i-1][j] > values[i][j-1])
values[i][j] = values[i-1][j] + mp[i][j],path[i][j] = path[i-1][j];
else if(values[i-1][j] == values[i][j-1])
values[i][j] = values[i-1][j] + mp[i][j],path[i][j] = (path[i-1][j] + path[i][j-1])%123456;
else
values[i][j] = values[i][j-1] + mp[i][j],path[i][j] = path[i][j-1];
}
printf("%d\n",path[N-1][N-1]%123456);
}
return 0;
}
8. 括號匹配,用個STL 加上累計到該位置的累計成功匹配括號數即可
ps: 字串長度千萬不要在迴圈裡面,因為這個TEL無數次 ...還有就是注意輸入的可能是右括號位置.
char str[maxn];
int match[maxn];
int tree[3][maxn];
void insert(int *a,int x){
while(x<maxn){
a[x] ++;
x += lowbit(x);
}
}
int get_sum(int *a,int x){
int res = 0;
while(x>0){
res += a[x];
x -= lowbit(x);
}
return res;
}
int main(){
while(~scanf("%s",str+1)){
stack<int> ss;
int s,m,l,n;
s=m=l=0;
memset(tree,0,sizeof(tree));
m=strlen(str+1);
for(int i = 1;i<=m;i++){
if(str[i]=='(' || str[i]=='[' || str[i]=='{')
ss.push(i);
else{
int t = ss.top();
ss.pop();
match[t]=i;
match[i]=t;
if(str[i]==')') insert(tree[0],t);
else if(str[i]==']') insert(tree[1],t);
else if(str[i]=='}') insert(tree[2],t);
}
}
scanf("%d",&n);
for(int i = 0;i<n;i++){
int t;
scanf("%d",&t);
int c=match[t];
printf("%d",c);
if(match[t]<t) c=t,t=match[t];
printf(" %d %d %d\n",get_sum(tree[0],c)-get_sum(tree[0],t),get_sum(tree[1],c)-get_sum(tree[1],t),get_sum(tree[2],c)-get_sum(tree[2],t));
}
printf("\n");
}
return 0;
}