啊~,對於這套題我最想說的是我H居然沒過,看來當時真的是比較累(雖然沒做多長時間就去吃飯了-_-!!),賽後睡一覺再看題不到20分鐘AC了,腦窩疼T_T。
晚上補題不順,B是矩陣快速冪明天在更新。
題意:給你n個木棍問最多能組成多少個三角形,木棍最多隻能組一個三角形。
思路:排序,從小到大遍歷三條邊三個循環,注意判斷木棍使用就行。
代碼如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
LL a[20];
int f[20];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
sort(a,a+n);
int sum=0;
memset(f,0,sizeof(f));
for(int i=0;i<n;i++)
{
if(f[i]==0){
for(int j=i+1;j<n;j++)
{
if(f[j]==0){
if(f[i]) break;
for(int k=j+1;k<n;k++)
{
if(f[k]==0){
if(f[j]) break;
if(f[i]) break;
if(a[i]+a[j]>a[k])
{
sum++;
f[i]=1;f[j]=1;f[k]=1;break;
}
}
}
}
}
}
}
printf("%d\n",sum);
}
Gym 100735E題意:給你一個去掉一條正對角線的矩陣讓你還原成所有行所有列的和都相等。
思路:分析分析題意後會發現有規律可尋,可假設左上角的值爲x,那麼接下來對角線上所有的的值都可以得到關於x的表達式,最後直接解方程就行啦。
代碼如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
LL a[105][105],b[105];
int main()
{
int n;
scanf("%d",&n);
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%lld",&a[i][j]);
b[i]+=(a[i][j]);
}
}
LL sum=0;
for(int i=1;i<n;i++)
{
sum+=b[0]-b[i];
}
a[0][0]=(b[0]-sum)/(n-1);
for(int i=1;i<n;i++)
{
a[i][i]=a[0][0]+(b[0]-b[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(j!=n-1)
printf("%lld ",a[i][j]);
else
printf("%lld",a[i][j]);
}
printf("\n");
}
}
Gym 100735G題意:給你一個由0和1組成的序列A然後求長度和A序列一樣的最小最長公共子序列。
思路:簡單的思考題,由於都只有0和1那麼就是求A中0和1哪個數量最少。
代碼如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
char str[100005];
int main()
{
scanf("%s",str);
int len=strlen(str);
int sum=0;
for(int i=0;i<len;i++)
{
if(str[i]=='0') sum++;
}
int ans=len-sum;
printf("%d\n",min(ans,sum));
}
題意:給你一個字符串S和n個六面的小方塊,小方塊每個面有個數字或者小寫英文字母,問能否用這n個方塊中的某些或者全部構成S。
思路:深搜遍歷,以S第一個字母開始。
代碼如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
char str[105],str1[105][10];
int vis[105];
struct Node
{
int x,y;
}d[1005];
int ans=0,n,len=0;
void dfs()
{
if(ans==len) return;
for(int i=0;i<n;i++)
{
if(vis[i]) continue;
for(int j=0;j<6;j++)
{
if(str1[i][j]==str[ans])
{
ans++;vis[i]=1;
if(len==ans) return;
dfs();
if(len==ans) return;
ans--;vis[i]=0;break;
}
}
}
}
int main()
{
cin>>str>>n;
int sum=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<6;j++)
{
cin>>str1[i][j];
if(str1[i][j]==str[0])
{
d[sum].x=i;d[sum++].y=j;
}
}
}
len=strlen(str);
memset(vis,0,sizeof(vis));
for(int i=0;i<sum;i++)
{
vis[d[i].x]=1;
ans=1;
dfs();
if(ans==len)
{
printf("YES\n");return 0;
}
ans=0;
vis[d[i].x]=0;
}
printf("NO\n");
}
題意:給你A,B,C三個數問能否用這三個數的某些數得到a+b=c;
思路:由於數據比較大,我只能套用java來做。如果用c++還得自己寫個類,比較麻煩建議用java
代碼如下:
import java.io.*;
import java.math.*;
import java.util.*;
import java.text.*;
public class p
{
public static void main(String[] args)
{
Scanner cin=new Scanner (System.in);
BigInteger a=new BigInteger(cin.next());
BigInteger b=new BigInteger(cin.next());
BigInteger c=new BigInteger(cin.next());
if(a.add(a).equals(b)||a.add(a).equals(c)||a.add(b).equals(c)
||b.add(b).equals(a)||b.add(b).equals(c)
||b.add(c).equals(a)||c.add(c).equals(a)||
c.add(c).equals(b)||c.add(a).equals(b))
{
System.out.println("YES");
}
else System.out.println("NO");
}
}