A題,計算兩個人的延遲,比較就好
#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
int main(int argc, char const *argv[])
{
int s,v1,v2,t1,t2;
while(cin>>s>>v1>>v2>>t1>>t2){
int ans1=s*v1+2*t1,ans2=s*v2+2*t2;
if(ans1<ans2){
printf("First\n");
}
else if(ans1>ans2){
printf("Second\n");
}
else{
printf("Friendship\n");
}
}
return 0;
}
B題,稍微水了一些,一開始那個n嚇到我了
#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
typedef long long ll;
bool cmp(const ll &a,const ll &b){
return a>b;
}
int main(int argc, char const *argv[])
{
ll k;
string num;
while(cin>>k>>num){
ll ans=0;
bool flag=0;
vector<int>vec;
for(int i=0;i<num.length();i++){
vec.push_back(9-num[i]+'0');
ans=ans+(num[i]-'0');
if(ans>=k){
flag=1;
break;
}
}
if(flag){
printf("0\n");
}
else{
sort(vec.begin(),vec.end(),cmp);
int cnt=0;
// for(int i=0;i<vec.size();i++){
// // cout<<vec[i]<<endl;
// }
for(int i=0;i<vec.size();i++){
// cout<<vec[i]<<endl;
ans+=(ll)vec[i];
cnt++;
if(ans>=k) break;
}
printf("%d\n",cnt);
}
}
return 0;
}
C題,直接暴力會超時,然後發現是有循環節的,所以前綴和直接優化
#include<iostream>
#include<cstdio>
using namespace std;
int a[201][201][21];
int x,y,x1,y1,s;
int main()
{
int n,q,c;
int i,j,k;
scanf("%d%d%d",&n,&q,&c);
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&s);
for(j=0;j<=c;j++)
a[x][y][j]+=(s+j)%(c+1);
}
for(i=1;i<=100;i++)
for(j=1;j<=100;j++)
for(k=0;k<=c;k++)
a[i][j][k]+=a[i][j-1][k]+a[i-1][j][k]-a[i-1][j-1][k];
for(i=1;i<=q;i++)
{
scanf("%d%d%d%d%d",&s,&x,&y,&x1,&y1);
s%=(c+1);
printf("%d\n",a[x1][y1][s]-a[x-1][y1][s]-a[x1][y-1][s]+a[x-1][y-1][s]);
}
}
D題,DP不會,先把代碼貼着
#include <bits/stdc++.h>
using namespace std;
#define test TEST
const int maxn=5005;
char s[maxn];
int dp[maxn][maxn],ans[maxn];
int main(int argc, char const *argv[])
{
while(~scanf("%s",s)){
int len=strlen(s);
ans[1]=len;
for(int i=0;i<len;i++){
dp[i][i]=1;
for(int l=i-1,r=i+1;l>=0&&r<len&&s[l]==s[r];l--,r++){
dp[l][r]=1;
}
for(int l=i,r=i+1;l>=0&&r<len&&s[l]==s[r];l--,r++){
dp[l][r]=1;
}
}
for(int d=2;d<=len;d++){
int g=d>>1;
for(int l=len-d;l>=0;l--){
int r=l+d-1;
if(dp[l][r]==0) continue;
dp[l][r]=max(dp[l][r],min(dp[l][l+g-1],dp[r-g+1][r])+1);
ans[dp[l][r]]++;
}
}
for(int i=len-1;i>=1;i--){
ans[i]+=ans[i+1];
}
for(int i=1;i<=len;i++){
printf("%d%c",ans[i],i==len?'\n':' ');
}
}
return 0;
}