怒A三题、虽然有点水
A. Guest From the Past
题意:就说一个人去喝酒,有n块钱,塑料瓶装的就是a块钱一瓶,玻璃瓶装酒是b块钱一瓶,一个玻璃瓶又可以换c块钱,问最多能喝到多少瓶酒
思路:很经典的模拟问题,类那个猴子吃桃,多少核桃又可以换一个桃那种题,不过这个题目有个坑点,看代码把
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 using namespace std; 5 int main() 6 { 7 long long n,a,b,c; 8 while(cin >> n >> a >> b >> c){ 9 long long maxn=n/a; 10 long long su=0; 11 long long k; 12 while(n>=b){ 13 k=n/b; 14 n=n-k*b; 15 su+=k; 16 n=n+k*c; 17 } 18 su+=n/a; //就是这个坑点,剩下的钱可能可以买几瓶塑料酒 19 if(maxn>su) cout << maxn << endl; 20 else cout << su << endl; 21 } 22 }
B. War of the Corporations
题意:给a串和b串和你问a串中有多少个b串
思路:典型的KMP字符串匹配问题
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 using namespace std; 5 const int qq=1e5+50; 6 char a[qq],b[qq],next[qq]; 7 long long tot; 8 void get() 9 { 10 int j,k; 11 next[0]=-1;j=0;k=-1; 12 while(j<strlen(b)-1){ 13 if(k==-1||b[j]==b[k]) 14 next[j++]=k++; 15 else 16 k=next[k]; 17 } 18 } 19 void KMP() 20 { 21 int i,j; 22 i=j=0; 23 while(i<strlen(a)){ 24 if(j==-1||a[i]==b[j]){ 25 ++i;++j; 26 } 27 else 28 j=next[j]; 29 if(j==strlen(b)){ 30 ++tot; 31 j=0; 32 } 33 } 34 } 35 int main() 36 { 37 while(~scanf("%s%s",a,b)){ 38 tot=0; 39 get(); 40 KMP(); 41 printf("%lld ",tot); 42 } 43 }
C. K-special Tables
题意:给一个n和k的,要求第k列的和最大,n*n的矩阵,要求1到n*n所有数都出现,且每一行从左到右要求为递增
思路:找规律把、看样例比较代码就可以看到规律了
1 #include<cstdio> 2 #include<cmath> 3 #include<iostream> 4 using namespace std; 5 const int qq=500+50; 6 int num[qq][qq]; 7 int main() 8 { 9 int n,k; 10 while(cin >> n >> k){ 11 int sum=0; 12 int ans=1; 13 for(int i=0;i<n;++i) 14 for(int j=0;j<k-1;++j) 15 num[i][j]=ans++; 16 for(int i=0;i<n;++i) 17 for(int j=k-1;j<n;++j) 18 num[i][j]=ans++; 19 for(int i=0;i<n;++i) 20 sum+=num[i][k-1]; 21 cout << sum << endl; 22 for(int j,i=0;i<n;++i){ 23 for(j=0;j<n;++j) 24 if(j==0) cout << num[i][j]; 25 else cout << " " << num[i][j]; 26 cout << endl; 27 } 28 } 29 }