A题
题意分析:
先把三个数由小到大排序,记做ABC。
我们先考虑把B变得和C一样大,那么全部采用在A和B碗各加一块肉。
然后判断此时的A和BC的差是不是偶数,偶数则全加2块肉和BC一样即可。
否则BC都加一块肉,然后重复上一个步骤即可。
#include
#include
#include
#include
using namespace std;
int a[5];
int step=0;
int main(){
int T;
cin>>T;
while(T--){
memset(a,0,sizeof(a));
for(int i=0;i<3;i++){
cin>>a[i];
}
sort(a,a+3);
int x=0;
int y=a[1]-a[0];
int z=a[2]-a[0];
step=z-y;
x=x+step;
int ans=z-x;
if(ans%2==0) step+=ans/2;
else {
step+=(ans+1)/2;
step++;
}
cout<return 0;
}
C题
背包问题。
dp[i][j]表示在前i件物品,前j分钟内花费最多的时间。
#include
#include
using namespace std;
int T,n,ai,bi,t[200],total,dp[200][20000],p;
int max(int a,int b){return a>b?a:b;}
int main(){
cin>>T;
while(T--){
memset(t,0,sizeof(t));
memset(dp,0,sizeof(dp));
p=0;
total=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>ai>>bi;
for(int j=1;j<=bi;j++){
t[++p]=ai;
total+=ai;
}
}
for(int i=1;i<=p;i++){
for(int j=1;j<=(total>>1);j++){
if(j-t[i]>=0){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+t[i]);
}
else{
dp[i][j]=dp[i-1][j];
}
}
}
cout<>1]<return 0;
}
typedef struct Node{
int time,num;
}node;
node hw[30];
bool cmp(const Node &a, const Node &b){
if(a.time>b.time) return true;
else if(a.time==b.time) return a.num>b.num;
else return false;
}
//LCS最长公共子序列
#include
#include
#define maxn 110
using namespace std;
int n,m;
char s[maxn],ss[maxn];
int dp[maxn][maxn];
void init(){
for(int i=0;ifor(int j=0;j0;
}
int max(int a,int b){
return a>b?a:b;
}
int main(){
init();
cin>>n>>m;
scanf("%s",s);
scanf("%s",ss);
for(int i=0;ifor(int j=0;jif(s[i]==ss[j]){
dp[i+1][j+1]=dp[i][j]+1;
}
else{
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
}
}
}
cout<2*dp[n][m]<return 0;
}
G题
注意啊,是输入多组数据,要用while循环输入。。WA了两回。。orz
#include
#include
#include
using namespace std;
int a,b,c;
int flag[10],hash[20];
int solve(int d){
int temp[4];
int p=0;
memset(hash,0,sizeof(hash));
if(d==1) hash[1]=hash[6]=1;
else if(d==2) hash[2]=hash[5]=1;
else if(d==3) hash[3]=hash[4]=1;
int ans=0;
for(int i=1;i<=6;i++){
if(flag[i]==1 &&hash[i]==0){
ans++;
}
}
if(ans==3||ans==4) return d;
else return 0;
}
int main(){
while(cin>>a>>b>>c){
int p=0,q=0;
memset(flag,0,sizeof(flag));
memset(hash,0,sizeof(hash));
for(int i=1;i<=6;i++){
if(i==a||i==b||i==c){
flag[i]=1; //队长选的标记
}
}
//去打磨1,2,3面
int a1=solve(1);
int a2=solve(2);
int a3=solve(3);
if(a1) cout<else if(a2) cout<else if(a3) cout<else
cout<<"0"<return 0;
}