SRM454 DIV2
眠気に襲われながらも参加。
250pt submit
500pt submit
1000pt closed
Challenges なし
250pt
201.46 / 250 pt
与えられたCの桁和とAからBの範囲の値で桁和の差が最小になるような値を求める。
つまらないミスで時間ロスした。これは240pt取ってないとだめだorz
500pt
150 / 500 pt
指定された文字列がgridの行or列を入れ替えて、縦(左から右)か横方向(上から下)に
生成出来るときは入れ替えの最小回数、生成出来ないときは-1
実装問題。
素直に実装したは良いが、終了間際になって同じ文字が複数出現した文字列の場合に
対応してないことに気付き、急いで修正再提出。ポイントは最低の150になったが、SystemPassして良かった。
計 351.46pt
rate 896→983(+87
んー、やはり問題文を理解出来るかどうかによるレートの上下はなんとかしたいw
// 250pt class MinimalDifference{ public: int sumd(int x) { int d=0; for(;x;x/=10)d+=x%10; return d; } int findNumber(int A, int B, int C) { int c=sumd(C); int ans=0;; int m=1000000001; for(int a=A;a<=B;a++){ if(m>abs(c-sumd(a))){ m=abs(c-sumd(a)); ans=a; } } return ans; } };
// 500pt class WordsGame { public: int minimumSwaps(vector <string> grid, string word) { unsigned char C[256]; int ans1,ans2,flag1,flag2; flag1=flag2=0; ans1=ans2=10000; memset(C,0,sizeof(C)); for(int i=0;i<word.size();i++)C[word[i]]++; for(int i=0;i<grid.size();i++){ int cnt1,cnt2; cnt1=cnt2=0; unsigned char CC1[256],CC2[256]; memset(CC1,0,sizeof(CC1)); memset(CC2,0,sizeof(CC2)); for(int j=0;j<grid[i].size();j++){ if(C[grid[i][j]])CC1[grid[i][j]]++; if(C[grid[j][i]])CC2[grid[j][i]]++; } int j; for(j=0;j<256 && C[j]==CC1[j];j++); if(j==256)cnt1=1; for(j=0;j<256 && C[j]==CC2[j];j++); if(j==256)cnt2=1; if(cnt1){ flag1=1; int tmp=0; vector<string> gg=grid; for(int k=0;k<word.size()-1;k++){ if(word[k]==gg[i][k])continue; int p; for(p=k+1;p<word.size()&&word[k]!=gg[i][p];p++); swap(gg[i][k],gg[i][p]); tmp++; } ans1=min(ans1,tmp); } if(cnt2){ flag2=1; int tmp=0; vector<string> gg2=grid; for(int k=0;k<word.size()-1;k++){ if(word[k]==gg2[k][i])continue; int p; for(p=k+1;p<word.size()&&word[k]!=gg2[p][i];p++); swap(gg2[k][i],gg2[p][i]); tmp++; } ans2=min(ans2,tmp); } } if(flag1&&flag2)return min(ans1,ans2); else if(flag1) return ans1; else if(flag2) return ans2; else return -1; } };